【问题标题】:Non greedy regex is not working as expected非贪婪的正则表达式没有按预期工作
【发布时间】:2015-07-20 17:31:44
【问题描述】:

我需要使用正则表达式非贪婪方法从字符串中提取某些部分。我正在处理以下字符串:

<a href="/guidance/">Hi</a> </li><li  > <a href="/news/institutional/2012/05/000001asdf">Thanks</a>

我需要从中获取:

<a href="/news/institutional/2012/05/000001asdf">Thanks</a>

我一直在尝试使用以下正则表达式:

<a.*?news/.*?/(\d{1,4}\/[01]?\d)?.*?</a>

但它获取所有字符串而不是上面提到的部分字符串。据我了解.*? 捕获最短匹配但它没有按预期工作。

【问题讨论】:

  • 这个正则表达式有很多问题。第一个修复是 &lt;a[^&gt;]*?news/.*?/(\d{1,4}/[01]?\d)?.*?&lt;/a&gt;,还需要更多修复。
  • @sln 谢谢你的评论。是的,它现在正在工作。您可以将其作为答案,我很高兴接受它。如果你不介意,你能解释一下 [^>] 吗?请让我知道其他修复,因为我正在学习正则表达式,希望我不会再重复同样的事情
  • @AruneshSingh - 除非用作分隔符,否则永远不需要转义正斜杠。
  • 我会回答的,但你能告诉我你想用这个选项匹配什么(\d{1,4}/[01]?\d)?
  • 我一直在尝试匹配 /2012/05/000001(数字可以不同),因为它需要考虑忽略所有其他没有这种数字模式的字符串

标签: c# regex regex-greedy


【解决方案1】:

这个[^&gt;]是一个负字符类,任何字符除了
支撑。这会阻止非贪婪的 .*? 匹配标签的末尾
(将其变为半贪婪)当它找不到特定的 news 锚时。

 #  @"(?s)<a[^>]*?news/[^>/]*?/(\d{1,4}(?:/\d+)*)?[^>]*?>.*?</a>"

 (?s)                  # Modifier, Dot-Matches any character
 <a                    # Open 'a' tag
 [^>]*?                # Any non '>' character
 news/                 # Need 'news/'
 [^>/]*?               # Any non '>' or '/' character
 /                     # Need '/'
 (                     # (1 start), Optional Date ?
      \d{1,4}               # 1-4 digit year
      (?: / \d+ )*          # month / day, etc ..
 )?                    # (1 end)
 [^>]*?                # Any non '>' character
 >                     # End Open '>' tag
 .*?                   # Anything
 </a>                  # Close 'a' tag 

C# 示例:

string news = @"
<a href=""/guidance/"">Hi</a> </li><li  > <a href=""/news/institutional/2012/05/000001asdf"">Thanks</a>
<a href=""/rintime/"">Hi</a> <a href=""/news/google/asdf"">GOOGLE</a>
";
Regex RxNews = new Regex(@"(?s)<a[^>]*?news/[^>/]*?/(\d{1,4}(?:/\d+)*)?[^>]*?>.*?</a>" );
Match _mNews = RxNews.Match( news );
while (_mNews.Success)
{
    Console.WriteLine("Found: {0}\r\nGroup 1 = {1}\r\n", _mNews.Groups[0].Value, _mNews.Groups[1].Value);
    _mNews = _mNews.NextMatch();
}

输出:

Found: <a href="/news/institutional/2012/05/000001asdf">Thanks</a>
Group 1 = 2012/05/000001

Found: <a href="/news/google/asdf">GOOGLE</a>
Group 1 =

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2011-04-27
    • 2010-10-20
    相关资源
    最近更新 更多