使用正则表达式获取部分匹配值

本文关键字:获取部 正则表达式 | 更新日期: 2023-09-27 17:57:00

我正在尝试获取字符串的一部分。

使用了以下表达式:

@"<a .*href=""(?<Url>(.*))(?="")"""

要匹配的示例数据:

var input = @"<html lang=""en"">
    <head>
        <link href=""http://www.somepage.com/c/main.css"" rel=""stylesheet"" type=""text/css"" />
        <link rel=""canonical"" href=""http://www.somepage.com"" />
        <script src=""http://www.somepage.com/professional/bower_components/modernizr/modernizr.js"" type=""text/javascript""></script>
    </head>
        <body>
            <header>
                <div>
                    <div>
                        <a aria-haspopup=""true"" href=""http://www.somepage.com/someotherpage""><img src=""http://www.somepage.com/i/sprite/logo.png"" alt=page"" /></a>
                    </div>
                </div>
            </header>
        </body>
    </html>"

现在我能够获得这个值:

http://www.somepage.com/someotherpage'"><img src=""http://www.somepage.com/i/sprite/logo.png"" alt=page"" /></a>

使用此代码:

var regexPattern = new Regex(PATTERN, RegexOptions.IgnoreCase);
var matches = regexPattern.Matches(httpResult);
foreach (Match match in matches)
{
    // here I'm getting this value 
    var extractedValue = match.Groups["Url"].Value; // it's value is http://www.somepage.com/someotherpage'"><img src=""http://www.somepage.com/i/sprite/logo.png"" alt=page"" /></a>
}

我想得到match.Groups["Url"].Value是简单的http://www.somepage.com/someotherpage href attribute值之后没有任何内容。

是否可以在不对extractedValue上使用Substring的情况下只获得比赛的那部分?

使用正则表达式获取部分匹配值

你快到了。只需在正则表达式中进行一个小更改,即可在匹配集中不允许引号。

<a .*href=""(?<Url>([^"]*))(?="")""
                  //^^^^ This is what i changed.

也许这会起作用。不幸的是,我现在没有时间测试它:

"<a[^>]*href='"(?<Url>([^'"]+))'"[^>]*>"

以下方法应该有效:

<a .*href=""(?<Url>(.+?))(?="")""

问题是在 (.*) 中 * 是贪婪的。 +?"匹配前一个元素一次或多次,但尽可能少",因此它将在第一个引号处停止。有关正则表达式中贪婪的更多信息,您可以查看正则表达式教程 - 使用 Star 和 Plus 重复

改用这种模式,不使用.*模因时少回溯(更快的处理)。此外,该模式使用 'x22 作为",以便更轻松地操作模式,因为它避免了 C# 文字混淆问题。

Regex.Matches(input, @"<a.+href='x22(?<Url>[^'x22]+).+/a>")
     .OfType<Match>()
     .Select (mt => mt.Groups["Url"].Value);
     // Result = http://www.somepage.com/someotherpage