登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  软件教程

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

时间:2026-08-21 09:44:31 250浏览 收藏

一、四种 Lookaround 语法总览

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

(?=...)

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

(?!...)

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

(?

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

(?

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

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

需求:

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

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

正则:

^(?=.*[A-Za-z])(?=.*d)[A-Za-zd]{8,16}$

拆解:

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

C#:

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

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

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

Regex.IsMatch("AdminUser", @"^(?!admin)w+$", RegexOptions.IgnoreCase); // False
Regex.IsMatch("user_admin", @"^(?!admin)w+$", RegexOptions.IgnoreCase); // True

四、后顾:做“切片式提取”

Lookbehind在“提取某个标记后面的内容”时非常实用,而且能让标记本身不被包含在匹配结果中。

1. 提取 UserId= 后面的数字

文本:

UserId=42 Action=Login

正则:

(?

C#:

var input = "UserId=42 Action=Login";
var m = Regex.Match(input, @"(?);
Console.WriteLine(m.Value); // 42

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

(?

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

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

例如找文本中“不是 ""”:

(?

含义:

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

需注意,这只是一种常见的思路。在真实的字符串中,可能会存在双重转义的情况(C#字符串字面量与文本内容的转义会混在一起)。因此,在编写测试时,务必清楚“源文本究竟是什么”。


结语

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

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>