C# 正则表达式(4):分支与回溯引用

一、分支 |:在多个候选中选一个

1. 最基本的 |

csharp 复制代码
Regex.IsMatch("my dog", @"cat|dog"); // True

2. 分支几乎总要配合分组

(?:...) 是非捕获分组,用于"只分组,不提取"。

csharp 复制代码
Console.WriteLine( Regex.IsMatch("https://www.baidu.com", @"(?:http|https)://")); // True
  • 想匹配 jpg/png/gif 结尾的文件名:
csharp 复制代码
Console.WriteLine( Regex.IsMatch("a.png", @"^.+\.(?:jpg|png|gif)$")); // True

二、分支的优先级与"从左到右"匹配

正则引擎通常会"先尝试左边分支",成功就不再看右边。

因此把短分支放在长分支前面,会导致长分支永远匹配不到。

csharp 复制代码
Console.WriteLine( Regex.IsMatch("ab", @"^(?:ab|a)$")); // True

三、回溯引用:让后面必须"重复前面匹配到的内容"

回溯引用依赖捕获组:(...)

  • 数字回溯引用:\1\2...(引用第 1、2...个捕获组)
  • 命名回溯引用:\k<name>(引用名为 name 的捕获组)

1. 匹配成对引号(单引号或双引号),并确保左右一致

示例:

匹配 "hello"'hello',但不允许 "hello' 这种左右不一致。

正则:

regex 复制代码
^(["'])(?<content>.*)\1$

解析::

  • (["']) 捕获一个引号字符(单或双),这是组 1
  • (?<content>.*) 捕获内容
  • \1 要求结尾引号必须和开头引号完全相同
csharp 复制代码
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")

需求:匹配两个相同单词,中间用空白分隔。

regex 复制代码
\b(\w+)\s+\1\b

示例:

csharp 复制代码
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>

把引号例子改成命名更清晰:

csharp 复制代码
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# 技术干货!如果觉得有用,记得收藏本文

相关推荐
前端开发爱好者2 小时前
VSCode 重磅更新!要收费了?
前端·javascript·visual studio code
曹牧3 小时前
Java:Assert.isTrue()
java·前端·数据库
脾气有点小暴3 小时前
uniapp自定义头部导航
前端·uni-app
假装我不帅3 小时前
jquery.nicescroll使用
前端·javascript·jquery
安_3 小时前
js 数组splice跟slice
开发语言·前端·javascript
用泥种荷花3 小时前
【LangChain学习笔记】链式调用
前端
yinuo4 小时前
IndexedDB 使用指南
前端
小徐_23334 小时前
2025,AI 编程元年,我用 TRAE 做了这些!
前端·程序员·trae
沛沛老爹4 小时前
Web开发者实战RAG评估:从指标到工程化验证体系
前端·人工智能·llm·agent·rag·评估