正则匹配 正则表达式 笔记 零宽正向先行断言 不包含等

技术文章1年前 (2025)更新 gyx131
334 0 0

1. (?=pattern) 零宽正向先行断言

作用:检查当前位置后面的字符是否匹配 pattern,但不消耗字符。
示例

 

  • 正则:\d+(?=元)
  • 匹配:字符串 100元 中的 100(仅当数字后接  时匹配)。

2. (?!pattern) 零宽负向先行断言

作用:检查当前位置后面的字符是否不匹配 pattern
示例

 

  • 正则:\d+(?!元)
  • 匹配:字符串 100美元 中的 100(数字后不接  时匹配)。

3. (?<=pattern) 零宽正向后行断言

作用:检查当前位置前面的字符是否匹配 pattern
示例

 

  • 正则:(?<=¥)\d+
  • 匹配:字符串 ¥100 中的 100(仅当数字前接 ¥ 时匹配)。

4. (?<!pattern) 零宽负向后行断言

作用:检查当前位置前面的字符是否不匹配 pattern
示例

 

  • 正则:(?<!¥)\d+
  • 匹配:字符串 $100 中的 100(数字前不接 ¥ 时匹配)。

关键区别

类型 方向 匹配条件 示例(匹配 apple 中的 p
正向先行断言 向后 后续字符符合 p(?=l)(第二个 p,后接 l
负向先行断言 向后 后续字符不符合 p(?!l)(第一个 p,后不接 l
正向后行断言 向前 前导字符符合 (?<=a)p(第一个 p,前接 a
负向后行断言 向前 前导字符不符合 (?<!a)p(第二个 p,前不接 a

应用场景

  • 敏感词过滤(?i)apple(?= juice) 匹配 Apple juice 但不匹配 Apple pie
  • 数字格式化(?<=\d)(?=(\d{3})+$) 在千位分隔符前插入逗号。
  • URL 提取(?<!href=")https?://\S+ 匹配独立 URL 而非链接中的 URL。

 

注意:后行断言在部分正则引擎(如 JavaScript 旧版本)中不支持,使用时需注意兼容性。

一、基础元字符

字符 含义 示例
. 匹配除换行符外的任意字符 a.c 匹配 abca1c
^ 匹配字符串开头 ^hello 匹配以 hello 开头的字符串
$ 匹配字符串结尾 world$ 匹配以 world 结尾的字符串
* 匹配前面的字符 0 次或多次 ab* 匹配 aababb
+ 匹配前面的字符 1 次或多次 ab+ 匹配 ababb,但不匹配 a
? 匹配前面的字符 0 次或 1 次 ab? 匹配 aab
{n} 匹配前面的字符恰好 n 次 a{3} 匹配 aaa
{n,} 匹配前面的字符至少 n 次 a{2,} 匹配 aaaaa
{n,m} 匹配前面的字符 n 到 m 次 a{2,3} 匹配 aaaaa

二、字符类

语法 含义 示例
[ ] 匹配方括号内的任意一个字符 [abc] 匹配 ab 或 c
[^ ] 匹配不在方括号内的任意字符 [^abc] 匹配除 abc 外的字符
- 在方括号内表示范围 [a-z] 匹配任意小写字母,[0-9] 匹配任意数字
| 或运算符 a|b 匹配 a 或 b

三、预定义字符类

简写 等价于 含义
\d [0-9] 匹配数字
\D [^0-9] 匹配非数字
\w [a-zA-Z0-9_] 匹配字母、数字、下划线
\W [^a-zA-Z0-9_] 匹配非字母、数字、下划线
\s [ \t\n\r\f\v] 匹配空白字符(空格、制表符、换行符等)
\S [^ \t\n\r\f\v] 匹配非空白字符

四、转义字符

字符 含义
\ 转义特殊字符,使其失去元字符含义 \. 匹配点号 .\* 匹配星号 *
\b 匹配单词边界(单词与非单词字符的交界处) \bcat\b 匹配独立的 cat,但不匹配 category
\B 匹配非单词边界 \Bcat\B 匹配 category 中的 cat,但不匹配独立的 cat
\n 匹配换行符
\t 匹配制表符

五、断言(零宽匹配)

语法 含义 示例
(?=pattern) 正向先行断言:匹配后面是 pattern 的位置 \d+(?=元) 匹配 100元 中的 100
(?!pattern) 负向先行断言:匹配后面不是 pattern 的位置 \d+(?!元) 匹配 100美元 中的 100
(?<=pattern) 正向后行断言:匹配前面是 pattern 的位置 (?<=¥)\d+ 匹配 ¥100 中的 100
(?<!pattern) 负向后行断言:匹配前面不是 pattern 的位置 (?<!¥)\d+ 匹配 $100 中的 100

六、分组与引用

语法 含义 示例
( ) 捕获分组:将括号内的内容作为一个整体,并记住匹配的内容 (ab)+ 匹配 ababab
(?: ) 非捕获分组:只分组,不记住匹配的内容 (?:ab)+ 匹配 ababab(性能略高)
\1\2 反向引用:引用前面捕获分组的内容 (\w)\1 匹配两个连续相同的字母,如 ee

七、贪婪与非贪婪匹配

字符 含义 示例
*+?{n,} 贪婪匹配:尽可能多的匹配 a.*b 匹配 acb 中的 acb
*?+???{n,}? 非贪婪匹配:尽可能少的匹配 a.*?b 匹配 acb 中的 a 和 b 之间的最短内容 c

八、其他常用符号

字符 含义
\A 匹配字符串开始(等价于 ^,但不受多行模式影响)
\Z 匹配字符串结束(等价于 $,但不受多行模式影响)
\z 严格匹配字符串结束(不考虑换行符)
(?i) 忽略大小写修饰符 (?i)hello 匹配 HelloHELLO 等
(?m) 多行模式:^ 和 $ 匹配每行的开始和结束
(?s) 单行模式:. 匹配包括换行符在内的所有字符

示例应用

  • 匹配邮箱^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 匹配 URLhttps?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+
  • 匹配 HTML 标签<[^>]+>
([\S\s](?!masonry-brick)){1,}         

#不包含
© 版权声明

相关文章

暂无评论

暂无评论...