我希望得到一个像</EM>
这样的结束html标记,只有在它之前的某个地方,即在任何先前的标记或文本之前没有起始<EM>
标记我的样本字符串
ddd d<STRONG>dfdsdsd dsdsddd<EM>ss</EM>r and</EM>and strong</STRONG>
在此字符串中输出应为</EM>
,这也是第二个</EM>
,因为它缺少起始<EM>
。我试过了
(?!=<EM>.*)</EM>
但它似乎无法正常工作请帮助你
答案 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 - 这是一个非常糟糕的主意。