正则表达式匹配除<p>标记</p>之外的任何/ HTML

时间:2013-10-08 13:43:34

标签: java html regex

基本上我需要匹配任何/不属于已关闭的&lt; p&gt;的HTML。标签。 这是我到目前为止所得到的,但它并没有按预期工作,我已经尝试了一段时间了。

((?<!(p))\/(?!(>))) | ((?<!(<))\/(?!(p)))

我还需要正则表达式在Java中工作。

举个例子:

&LT; DIV&GT;试验&LT; / DIV&GT; &LT;跨度&GT;试验&LT; /跨度&GT; &LT; p为H.东西&LT; P /&GT; &LT; / p为H.

我希望它匹配每个/除了最后<p>标签中的那些!

2 个答案:

答案 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.]]>