正则表达式捕获组问题

本文关键字:问题 正则表达式 | 更新日期: 2023-09-27 18:34:43

我想解析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文件中找到了匹配项,但是我得到了空白捕获组。

正则表达式捕获组问题

你可以尝试这样的模式:

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

这将匹配:

  • 字面上的<
  • 字面LINK,在第1组中捕获
  • 零或多个任何字符,非贪婪
  • 以下任一情况
    • 单个"',在第2组中捕获
    • 零个或多个任何角色,非贪婪地,在组URL中捕获.
    • 第 2 组中匹配的任何内容('2是反向引用(
    • 除空格或>之外的任何字符的零个或多个,贪婪地捕获在组URL中。
  • 零或多个任何字符,非贪婪
  • 字面上的>

这将正确处理以下输入:

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