【问题标题】:Regex - Match an end html tag if start tag is not present正则表达式 - 如果开始标记不存在,则匹配结束 html 标记
【发布时间】:2008-12-02 07:32:05
【问题描述】:

我想得到一个像</EM>这样的结束html标签,只有在它之前的某个地方,即在任何以前的标签或文本之前没有开始<EM>标签我的示例字符串是

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

在这个字符串中,输出应该是&lt;/EM&gt;,这也是第二个&lt;/EM&gt;,因为它缺少起始&lt;EM&gt;。我试过了

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

但它似乎不起作用,请帮助thnks

【问题讨论】:

  • 我使用的正则表达式同时带有 &lt;/EM&gt;s 而我只希望匹配第二个
  • 您可以随时编辑自己的帖子以添加补充和说明。他们更有可能以这种方式阅读。

标签: c# .net regex


【解决方案1】:

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

总之,一个像这样的 C# 正则表达式:

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

只会带第二个&lt;/EM&gt;标签

注意:

  • ?! 是一个负面的展望向前,这解释了为什么会同时找到 &lt;/EM&gt;
    所以...(?!=&lt;EM&gt;.*)xxx实际上是指如果xxx后面没有=&lt;EM&gt;.*,则捕获xxx。我不确定您是否想在其中包含 =
  • ?&lt;! 是一个负面的外观behind,更适合您想要做的事情,但它不适用于 java regex 引擎,因为这个look-behind regex 没有明显的最大长度。

但是,使用 .Net 正则表达式引擎,正如在 RETester 上测试的那样,它确实可以工作。

【讨论】:

  • 我试过了,它不起作用,它带来的匹配和我的完全一样,谢谢
  • 如果 EM 标签有这样的子标签,它会失败: ddd ddfdsdsd dsdsdddssrdfddfs nd 和强大的
  • @shabby 我同意。当时(大约 5 年前)我只是根据您在问题中的示例测试正则表达式。它不会匹配所有情况,但自 2011 年 10 月以来,我们都知道 ;) stackoverflow.com/a/1732454/6309
【解决方案2】:

您需要pushdown automaton。正则表达式不足以捕捉这个概念,因为它们等同于finite-state automata,所以严格来说,正则表达式解决方案是不可行的。

也就是说,.NET 正则表达式确实在它们后面有一个下推自动机,因此它们理论上可以处理这种情况。如果您真的觉得需要使用正则表达式而不是正式的 HTML 解析器来执行此操作,请查看here

【讨论】:

  • 有趣。这不是“前向引用”的高级形式吗? (regular-expressions.info/brackets.html)
  • 并非如此:前向引用的工作方式与后向引用类似,即将其内容存储在数组中就足够了。但是,为了使平衡组起作用,这些组的内容必须存储在堆栈中(这是“下推”部分)。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多