正则表达式捕获组问题

时间:2013-10-09 19:33:01

标签: c# .net regex

我想解析html文件中的所有链接标记。所以为此我写了以下正则表达式。

var pattern = @"<(LINK).*?HREF=(""|')?(?<URL>.*?)(""|')?.*?>";
var regExOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline;

var linkRegEx = new Regex(pattern , regExOptions );

foreach (Match match in linkRegEx.Matches(htmlFile))
{
    var group = match.Groups["URL"];
    var url = group.Value;
} 

但是我发现从html文件中找到匹配但是我得到了空白捕获组。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的模式:

var pattern = @"<(LINK).*?HREF=(?:([""'])(?<URL>.*?)\2|(?<URL>[^\s>]*)).*?>";

这将匹配:

  • 文字<
  • 在第1组中捕获的文字LINK
  • 任何角色的零个或多个,非贪婪
  • 以下任一项
    • 在第2组中捕获的单个"'
    • URL组中捕获的非贪婪任何角色的零个或多个。
    • 组2中匹配的内容(\2是后引用)
    • 除了空格或>之外的任何字符的零个或多个,贪婪地在组URL中捕获。
  • 任何角色的零个或多个,非贪婪
  • 文字>

这将正确处理如下输入:

  • <LINK HREF="Foo">生成url = "Foo"
  • <LINK HREF='Bar'>生成url = "Bar"
  • <LINK HREF=Baz>生成url = "Baz"