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 小时前
m111基于MVC的舞蹈网站的设计与实现
java·前端·数据库·spring boot·spring·mvc
C_心欲无痕10 小时前
前端实现水印的两种方式:SVG 与 Canvas
前端·安全·水印
我的炸串拌饼店13 小时前
火山方舟API C#服务类设计解析
c#·调用火山方舟api
尾善爱看海13 小时前
不常用的浏览器 API —— Web Speech
前端
美酒没故事°14 小时前
vue3拖拽+粘贴的综合上传器
前端·javascript·typescript
观无14 小时前
visionPro图像预处理
c#
不绝19114 小时前
C#核心:继承
开发语言·c#
jingling55515 小时前
css进阶 | 实现罐子中的水流搅拌效果
前端·css
Knight_AL16 小时前
用 JOL 验证 synchronized 的锁升级过程(偏向锁 → 轻量级锁 → 重量级锁)
开发语言·jvm·c#
悟能不能悟16 小时前
前端上载文件时,上载多个文件,但是一个一个调用接口,怎么实现
前端