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

相关推荐
崔庆才丨静觅5 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60616 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了6 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅6 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
懒人咖7 小时前
缺料分析时携带用料清单的二开字段
c#·金蝶云星空
崔庆才丨静觅7 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment7 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅7 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊7 小时前
jwt介绍
前端