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

相关推荐
utmhikari1 小时前
【AI原生】借助AI之力优化个人博客前端样式
前端·css·hexo·next·个人博客·ai-native·vibe coding
小凯在掘金2 小时前
为什么箭头函数不能作为构造函数?
前端·javascript
JustHappy3 小时前
「vConsole MCP🛠️」我让 AI 直接看见任何 H5 的日志和请求帮你 debug
前端·javascript·程序员
codeGoogle3 小时前
Vue3 UIKit 实战:把聊天、会话、主题和移动端适配全部封装好
前端
czhc11400756633 小时前
退出防呆:用“总闸“收口所有退出入口,以及三个并发语法坑
开发语言·c#
大龄秃头程序员4 小时前
iOS Method Swizzling 的工程化实践:如何处理多重交换与第三方冲突
前端
liangshanbo12154 小时前
Webpack 文件指纹面试题整理
前端·webpack·node.js
xieter4 小时前
【技术精选】Node.js 核心事件循环机制与异步 I/O 深度剖析 (2026-10-02)
前端·javascript
计算机魔术师4 小时前
Ethan Mollick 谈点与群:智能体自组织为何让管理假设失效
前端
故七月5 小时前
GEO 信源评估体系:如何判断一条网页信源能否被大模型采信
前端·网络·人工智能