C# 正则表达式(5):前瞻/后顾(Lookaround)——零宽断言做“条件校验”和“精确提取”

一、四种 Lookaround 语法总览

1. 正向前瞻(必须能看到...)

regex 复制代码
(?=...)

2. 负向前瞻(必须看不到...)

regex 复制代码
(?!...)

3. 正向后顾(前面必须是...)

regex 复制代码
(?<=...)

4. 负向后顾(前面必须不是...)

regex 复制代码
(?<!...)

二、前瞻:最常见的"密码/复杂规则校验"写法

1.至少包含一个字母和一个数字(长度 8~16)

需求:

  • 总长度 8~16
  • 只能字母数字
  • 至少 1 个字母
  • 至少 1 个数字

正则:

regex 复制代码
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$

拆解:

  • ^...$:整串校验
  • (?=.*[A-Za-z]):从当前位置往后看,必须能找到字母
  • (?=.*\d):必须能找到数字
  • [A-Za-z\d]{8,16}:真正需要匹配字符的主体

C#:

csharp 复制代码
var pattern = @"^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$";
Regex.IsMatch("abc12345", pattern); // True
Regex.IsMatch("abcdefgh", pattern); // False (无数字)
Regex.IsMatch("12345678", pattern); // False (无字母)

三、负向前瞻:禁止某些前缀/全局禁用模式

1. 不能以 admin 开头(不区分大小写可用选项)

csharp 复制代码
Regex.IsMatch("AdminUser", @"^(?!admin)\w+$", RegexOptions.IgnoreCase); // False
Regex.IsMatch("user_admin", @"^(?!admin)\w+$", RegexOptions.IgnoreCase); // True

四、后顾:做"切片式提取"

Lookbehind 非常适合"提取某个标记后面的内容",但不想把标记本身包含进匹配结果。

1. 提取 UserId= 后面的数字

文本:

text 复制代码
UserId=42 Action=Login

正则:

regex 复制代码
(?<=UserId=)\d+

C#:

csharp 复制代码
var input = "UserId=42 Action=Login";
var m = Regex.Match(input, @"(?<=UserId=)\d+");
Console.WriteLine(m.Value); // 42

2. 提取 URL 参数值(示例:id= 后面的一段数字)

regex 复制代码
(?<=\bid=)\d+

五、负向后顾:避免"被转义的分隔符"等场景

一个典型需求:找到未被反斜杠转义的引号/分隔符。

例如找文本中"不是 \""":

regex 复制代码
(?<!\\)"

含义:

  • (?<!\\):前面不是反斜杠
  • ":匹配一个双引号

注意:这只是一个常见思路,真实字符串里会有双重转义(C# 字符串字面量与文本内容的转义混在一起),写测试时要分清"源文本到底是什么"。


结语

点个赞,关注我获取更多实用 C# 技术干货!如果觉得有用,记得收藏本文

相关推荐
爱喝白开水a28 分钟前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
董世昌4129 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
kylezhao20191 小时前
C#序列化与反序列化详细讲解与应用
c#
JQLvopkk1 小时前
C# 实践AI :Visual Studio + VSCode 组合方案
人工智能·c#·visual studio
吃杠碰小鸡2 小时前
高中数学-数列-导数证明
前端·数学·算法
故事不长丨2 小时前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
kingwebo'sZone2 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09012 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农2 小时前
Vue 2.3
前端·javascript·vue.js
大空大地20262 小时前
表达式与运算符
c#