非贪婪的正则表达式没有按预期工作
Non greedy regex is not working as expected
我需要使用正则表达式非贪婪方法从字符串中提取特定部分。我正在处理以下字符串:
<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>
但据我所知,它获取所有字符串而不是提到的部分字符串 above.As .*?
捕获最短匹配,但它没有按预期工作。
这个[^>]
是负数字符class,任何字符除了角
支撑。这会阻止非贪婪 .*?
匹配标签的末尾
(将其变为半贪婪)当它找不到特定的 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 =
我需要使用正则表达式非贪婪方法从字符串中提取特定部分。我正在处理以下字符串:
<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>
但据我所知,它获取所有字符串而不是提到的部分字符串 above.As .*?
捕获最短匹配,但它没有按预期工作。
这个[^>]
是负数字符class,任何字符除了角
支撑。这会阻止非贪婪 .*?
匹配标签的末尾
(将其变为半贪婪)当它找不到特定的 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 =