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

相关推荐
东风破_5 小时前
Docker 基础:为什么需要容器?
前端·后端·nginx
东风破_5 小时前
Docker 实战:使用 Nginx 作为容器入口代理 Node 服务
前端·后端·nginx
你别说话了6 小时前
Vue项目解决跨域
前端·javascript·vue.js
唐青枫6 小时前
http-server:别再双击 index.html,一条命令把目录变成网站
前端·javascript
网安蟹佬霸7 小时前
OSINT开源情报收集实战:从信息搜集到资产测绘(2026最新万字保姆级指南)
前端·网络·安全·web安全·网络安全·开源
a1117767 小时前
3D历史建筑展览馆 THreeJS 开源
前端·开源
单线程_017 小时前
【源码阅读】Vue3 Tokenizer 词法分析器完整状态机流转深度梳理(3.4+ 新版架构)
前端
PBitW7 小时前
PM 丢来 3 个 Excel、12 个功能、4 种情形?用 TRAE Work 30 分钟整理成前端开发文档
前端·trae
Vae_Mars7 小时前
C#中的delegate委托
开发语言·c#
OPEN-F9 小时前
Python进阶教程:正则表达式进阶与文本处理
开发语言·python·正则表达式