非贪婪正则表达式没有按预期工作

本文关键字:工作 贪婪 正则表达式 | 更新日期: 2023-09-27 18:03:32

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

<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>

我一直在尝试以下regex:

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

,但它得到所有的字符串,而不是上面提到的字符串的一部分。据我所知,.*?捕获最短匹配,但它没有像预期的那样工作。

非贪婪正则表达式没有按预期工作

这个[^>]是一个负字符类,任何字符除了
撑。这将阻止非贪婪.*?匹配标签
的结尾。(把它变成半贪婪),当它找不到特定的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 =