【问题标题】:C# Regex optional matchC# 正则表达式可选匹配
【发布时间】:2011-08-10 14:03:18
【问题描述】:

我有一些页面内容包含以下代码行的多次出现:

<li class="r"><h3><a href="/test-url.htm">test string</a></h3></li>

我正在使用 .NET Regex 来查找内容中的所有匹配项并将锚标记的 href 返回给我。

我的问题是,有时 &lt;li&gt; 在类周围有引号(如上所示),但其他人没有,只有:class=r

我需要对带引号和不带引号的匹配项。

我尝试了各种方法,但似乎都没有奏效。有引号时它们都匹配,但没有引号时不匹配。以下是我目前的尝试:

Regex _Regex = new Regex(@"<li class=(?:"")g([^>])*>((?!<h3).)*<h3([^>])*><a\shref=""(?<URL>[^""]*)""([^>])*>((?!</li).)*", RegexOptions.IgnoreCase);

非常感谢任何帮助,

谢谢。

【问题讨论】:

  • Regex 不太擅长处理 HTML。如果您只是想查找重复项,则最好使用 xpath
  • 我知道我没有回答你的问题,但你不应该使用正则表达式来解析 HTML。改用Html Agility Pack 会更好。
  • +1 这个想法,非常好用。
  • 感谢您的评论。 Html Agility Pack 是否需要有效的 HTML?我打开了&lt;li&gt; 没有关闭&lt;/li&gt; 的几个地方,我无法控制内容以使其有效。
  • @Scrooby 它相当宽容 - 试试看。

标签: c# .net regex


【解决方案1】:

我认为你想要的格式是

“”?

不是

?:

问号将前面的字符标记为可选。

【讨论】:

    【解决方案2】:

    诀窍是匹配并捕获可选的第一个引号,因此该组最终包含引号或空字符串。然后你在词尾使用反向引用来再次匹配相同的东西。

    @"<li class=(""?)r\1[^>]*>"
    

    顺便说一句,这在您的正则表达式中出现了 3 次,这是错误的:([^&gt;])*。它匹配你想要的,但它只捕获最后一个字符。如果您需要捕获这些段,您应该在组内移动星号。如果您不需要捕获它,只需像我一样去掉括号。

    【讨论】:

      【解决方案3】:

      这是正则表达式的一部分。我想你知道如何解决它:

      <li class=["r]+?>
      

      <li class=["]?r["]?>
      

      它们都有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多