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

相关推荐
计算机魔术师13 分钟前
英伟达要投100亿美元入股Anthropic,史上最大IPO的底牌
前端
yume_sibai1 小时前
02-Flutter进阶开发
前端·flutter
a1117761 小时前
莱茵生命终端 网页 html
前端·开源
水月清辉2 小时前
CSS 常用语法详解
前端·css
XiaoZhenHua982 小时前
C#工业机器视觉Recipe配方系统设计:多型号、多相机、多工位参数如何统一管理
c#·软件架构·机器视觉·工业自动化·工业软件·recipe
Eric_见嘉3 小时前
打开这个 VSC 设置「组件引用位置」和数量就都清楚了
前端·typescript·visual studio code
李高钢3 小时前
Python Tornado 框架入门:从零搭建你的第一个异步 Web 应用
前端·python·tornado
宁风3 小时前
JavaScript:函数体系-1
前端·javascript
mmsx3 小时前
Android 手簿 ADB 无线调试全攻略:USB 转 WiFi 一键连接
android·前端
guwentian3 小时前
Rolldown vs esbuild vs Webpack:Rust 打包器大战我们该怎么选
前端·webpack·rust·esbuild