1. href\s=\s: 这部分匹配 href 关键字,后面可以随着零个或多个空缺字符,然后是一个等号,再然后又是零个或多个空缺字符。
个中href: 直接匹配文本中的"href",这是HTML中表示链接地址的属性名称。
\s=\s: 匹配等号(=),等号前后可以有0个或多个空缺字符(包括空格、制表符、换行符等)。

2. (?:...): 这是一个非捕获组,意味着它会匹配括号内的内容,但不会为其创建一个捕获组。
这意味着我们不能直接从匹配结果中提取这部分内容。

3. [""'](?<1>[^""'])[""']: 这部分匹配被单引号或双引号包围的任何内容。
详细来说:

html中a标记href值正则表达式批量替换从HTML中提取href属性的机密兵器正则表达式全解析 AJAX
(图片来自网络侵删)

1. [""']: 匹配一个单引号或双引号。

2. (?<1>[^\"']): 创建了一个命名捕获组,名为1,用来捕获在引号之间的任何非引号字符序列,这便是href属性的值。
(?<1>...): 这是一个命名捕获组,但这里它被放在了一个非捕获组内,这意味着它不会捕获匹配的内容。

3. [^""']: 匹配任何不是单引号或双引号的字符零次或多次。

4. [""']: 再次匹配一个单引号或双引号。

4. |: 或者操作符,表示前面的模式和后面的模式中的任何一个可以匹配。
又叫管道符号,代表逻辑“或”操作,也便是表示前面的模式与后面的模式任一知足即可。

5. (?<1>[^>\s]+): 这部分匹配任何不是大于符号或空缺字符的字符一次或多次。
这也是一个命名捕获组,但同样,它被放在了一个非捕获组内。
当href值没有被引号包围时利用。
也便是这部分匹配不是大于符号(>)和空缺字符的任何字符1次或多次,但不包括引号。

综上所述,此正则表达式能够处理以下两种格式的href属性及其值:

1. 被引号包围的情形:<a href="http://example.com">...</a> 或 <a href='http://example.com'>...</a>

2. 未被引号包围的情形:<a href=http://example.com>...</a>

实例演示用法:

using System.Text.RegularExpressions;

namespace ConsoleAppC

{

internal class Program

{

static void Main(string[] args)

{

string inputString = @"<a href=""http://example.com"">Link</a>

<a href='http://another.example.com'>Another Link</a>

<a href=http://noquotes.example.com>No Quotes Link</a>";

string hrefPattern = @"href\s=\s(?:[""'](?<1>[^""'])[""']|(?<1>[^>\s]+))";

MatchCollection matches = Regex.Matches(inputString, hrefPattern);

foreach (Match match in matches)

{

Console.WriteLine(match.Value); // 输出匹配到的href属性值

Console.WriteLine($"Found href value: {match.Groups[1].Value} at index: {match.Groups[1].Index}");

}

}

}

}

运行这段代码后,将输出如下结果:

href="http://example.com"

Found href value: http://example.com at index: 9

href='http://another.example.com'

Found href value: http://another.example.com at index: 72

href=http://noquotes.example.com

Found href value: http://noquotes.example.com at index: 150

为了给大家演示如何利用这个正则表达式,我们再看以下例子:

假设我们有以下的HTML片段:

<a href="https://www.example.com">Click here</a>

<a href='https://www.example.org'>Go there</a>

<a href="https://www.example.net" target="_blank">Open external link</a>

利用上述的正则表达式,我们可以提取所有的href属性值:

string input = @"<a href=\""https://www.example.com\"">Click here</a>

<a href='https://www.example.org'>Go there</a>

<a href=\""https://www.example.net\"" target=\""_blank\"">Open external link</a>";

代码为:

string hrefPattern = @"href\s=\s(?:[""'](?<1>[^""'])[""']|(?<1>[^>\s]+))";

Regex regex = new Regex(hrefPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);

MatchCollection matches = regex.Matches(input);

foreach (Match match in matches)

{

Console.WriteLine($"Found href: {match.Groups["1"].Value}");

}

string input = @"<a href=\""https://www.example.com\"">Click here</a>

输出将是:

Found href: \"https://www.example.com\"

Found href: https://www.example.org

Found href: \"https://www.example.net\"

把稳,这个正则表达式并不完美,它可能无法处理所有可能的HTML格式,但对付大略的用场来说可能已经足够了。