正则表达式 - 如果不存在开始标记,则匹配结束html标记

时间:2008-12-02 07:32:06

标签: c# .net regex

我希望得到一个像</EM>这样的结束html标记,只有在它之前的某个地方,即在任何先前的标记或文本之前没有起始<EM>标记我的样本字符串

ddd d<STRONG>dfdsdsd dsdsddd<EM>ss</EM>r and</EM>and strong</STRONG>

在此字符串中输出应为</EM>,这也是第二个</EM>,因为它缺少起始<EM>。我试过了

(?!=<EM>.*)</EM>

但它似乎无法正常工作请帮助你

3 个答案:

答案 0 :(得分:3)

我不确定正则表达式最适合这种任务,因为标签总是可以嵌套。

无论如何,C#正则表达式如下:

(?<!<EM>[^<]+)</EM>

只会带来第二个</EM>标记

请注意:

  • ?!是一个负面的提前,它解释了找到</EM>的原因。 所以...... (?!=<EM>.*) xxx实际上意味着捕获xxx,如果它没有跟=<EM>.*。我不确定您是否希望在其中加入=
  • ?<!背后的消极外观,更适合您想要做的事情,但是对于java正则表达式引擎不适用,因为这个后置正则表达式没有明显的最大长度。

然而,对于RETester测试的.Net正则表达式引擎,它确实有效。

答案 1 :(得分:0)

这里需要pushdown automaton。正则表达式不足以捕获这个概念,因为它们等同于finite-state automata,因此正则表示正则表达式解决方案是禁止的。

也就是说,.NET正则表达式后面有一个下推自动机,所以他们理论上可以处理这种情况。如果您真的觉得需要使用正则表达式而不是正式的HTML解析器,请瞥一眼here

答案 2 :(得分:0)

你应该看到this other Stack Overflow question的最佳答案,因为它给出了完美的答案。简而言之,不要使用正则表达式来尝试解析HTML - 这是一个非常糟糕的主意。