基本上我需要匹配任何/不属于已关闭的< p>的HTML。标签。 这是我到目前为止所得到的,但它并没有按预期工作,我已经尝试了一段时间了。
((?<!(p))\/(?!(>))) | ((?<!(<))\/(?!(p)))
我还需要正则表达式在Java中工作。
举个例子:
&LT; DIV&GT;试验&LT; / DIV&GT; &LT;跨度&GT;试验&LT; /跨度&GT; &LT; p为H.东西&LT; P /&GT; &LT; / p为H.
我希望它匹配每个/
除了最后<p>
标签中的那些!
答案 0 :(得分:0)
/(?!p)
这似乎有效。但我不确定问题是什么。
<div>test</div> <span>test</span> <p>something<p/> </p>
matches: / / /
答案 1 :(得分:0)
幸运的是,Java支持lookbehind和lookahead(相比之下,我花费大部分时间的语言,JavaScript,仅支持预测)。
所以你要找的模式是:
(?<!<p)/(?!p>)
此模式将匹配任何前面没有<p
或后跟p>
的斜杠。因此,它会排除<p/>
以及</p>
。
前瞻/后瞻断言(通常称为“零宽度”断言)实际上并未包含在匹配中,这听起来像你想要的。它基本上断言你想要匹配的东西前面是(lookbehind)或者后面是(lookahead)一个子表达式。在这种情况下,我们使用否定断言(前面没有/后面没有)。
使用正则表达式解析HTML是一项琐碎的业务。正如一个答案所指出的,HTML是无上下文的,因此无法通过HTML完全解析,从而打开了混淆匹配的HTML的可能性。我们甚至没有开始使用格式错误的HTML。
我会考虑空标记的以下常见变体:
<p />
为了解决这个问题,我会在比赛中添加一些空格:
(?<!<p\s*)/(?!p>)
你可能遇到问题的地方是奇怪的空白(仍然是有效的HTML)。以下斜杠将与上述正则表达式匹配:
< p/>
<p/ >
这可以通过向正则表达式添加更多空白区域来解决。如前所述,这也将匹配文本中的斜杠,因此以下输入将只匹配一个斜杠(文本中的斜杠):
<p>some text / other text</p>
最后,当然还有CDATA小组。以下输入将匹配NO斜杠:
<![CDATA[This <p/> isn't actually a tag...it's just text.]]>