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

相关推荐
明月_清风21 分钟前
自定义右键菜单:在项目里实现“选中文字即刻生成新提示”
前端·javascript
明月_清风21 分钟前
告别后端转换:高质量批量导出实战
前端·javascript
刘发财5 小时前
弃用html2pdf.js,这个html转pdf方案能力是它的几十倍
前端·javascript·github
牛奶7 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶7 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
Kagol10 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路11 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide11 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter12 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸12 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端