C# 正则表达式(4):分支与回溯引用
2025年12月28日 21:24
一、分支 |:在多个候选中选一个
1. 最基本的 |
Regex.IsMatch("my dog", @"cat|dog"); // True
2. 分支几乎总要配合分组
(?:...) 是非捕获分组,用于“只分组,不提取”。
Console.WriteLine( Regex.IsMatch("https://www.baidu.com", @"(?:http|https)://")); // True
- 想匹配
jpg/png/gif结尾的文件名:
Console.WriteLine( Regex.IsMatch("a.png", @"^.+\.(?:jpg|png|gif)$")); // True
二、分支的优先级与“从左到右”匹配
正则引擎通常会“先尝试左边分支”,成功就不再看右边。
因此把短分支放在长分支前面,会导致长分支永远匹配不到。
Console.WriteLine( Regex.IsMatch("ab", @"^(?:ab|a)$")); // True
三、回溯引用:让后面必须“重复前面匹配到的内容”
回溯引用依赖捕获组:(...)。
- 数字回溯引用:
\1、\2…(引用第 1、2…个捕获组) - 命名回溯引用:
\k<name>(引用名为 name 的捕获组)
1. 匹配成对引号(单引号或双引号),并确保左右一致
示例:
匹配 "hello" 或 'hello',但不允许 "hello' 这种左右不一致。
正则:
^(["'])(?<content>.*)\1$
解析::
-
(["'])捕获一个引号字符(单或双),这是组 1 -
(?<content>.*)捕获内容 -
\1要求结尾引号必须和开头引号完全相同
string[] inputs = { "\"hello\"", "'hello'", "\"hello'", "'hello\"" };
var pattern = @"^([""'])(?<content>.*)\1$";
foreach (var s in inputs)
{
var m = Regex.Match(s, pattern);
Console.WriteLine($"{s} -> {m.Success}");
}
2. 匹配重复单词(如 “hello hello”)
需求:匹配两个相同单词,中间用空白分隔。
\b(\w+)\s+\1\b
示例:
var text = "This is is a test, hello hello!";
var pattern = @"\b(\w+)\s+\1\b";
foreach (Match m in Regex.Matches(text, pattern))
{
Console.WriteLine(m.Value); // "is is", "hello hello"
}
3. 命名回溯引用:\k<name>
把引号例子改成命名更清晰:
var text = "This is is a test, hello hello!";
var pattern = @"\b(?<word>\w+)\s+\k<word>\b";
foreach (Match m in Regex.Matches(text, pattern))
{
Console.WriteLine(m.Value); // "is is", "hello hello"
}
结语
点个赞,关注我获取更多实用 C# 技术干货!如果觉得有用,记得收藏本文