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