根据百度百科, 捕获分组,非捕获分组共6种
分组的概念: 一对括号内的表达式匹配到的值, 就是一个分组
举例文本: 111_A3Z_000
(pattern) 后续分组可以拿到 pattern匹配的值
举例: (A\d)Z
分组$0 是当前整个表达式匹配到的值A3Z
分组$1 的值就是A3
分组可以调整顺序, 组合别的字符 达到不少特别的效果, 比如 大小写转换 \U$1 \L$1
(?:pattern) 分组不能拿到pattern匹配的值(不存储结果)
举例文本: Windows2000 Windows3.1 Windows10
(?=pattern) 更适合匹配表达式前面的, 分组不能拿到pattern的值, 表达式匹配不包含pattern
举例: Windows(?=2000), 匹配Windows, 后面是2000的
匹配的结果是由 正向肯定+pattern组合而成
举例: 13_a3 \d(?=3), 意思是 "数字+3"
如果待替换的值为0, 那么结果是 03_a3
"数字"部分是命中的且参与替换, (?=3) 也被命中但没有参与替换
为什么推荐进行正向匹配?
因为pattern不占用指针位置,(?=pattern)后面的值 就必须是 在pattern的基础上进行增加
那能不能在表达式后面 添加pattern? 当然可以
举例: 131_13A_A3A_121 (?=3)\d\d 从有3的前面开始匹配, 最终只有131能命中 31
也就是说 (?=3)\d\d 红色部分的pattern语意是要一致的
(?!pattern) 更适合匹配表达式前面的, 语义同上相反
举例: Windows(?![95|98|NT|2000]), 匹配Windows 但后面不是 95|98|NT|2000 的
举例文本: 2000Windows 3.1Windows 10Windows
(?<=pattern) 更适合匹配表达式后面的, 分组不能拿到pattern的值, 表达式匹配不包含pattern
举例: (?<=[95|98|NT|2000])Windows, 匹配2000后面的Windows
参考正向肯定
(?<!pattern) 更适合匹配表达式后面的, 语义同上相反
举例: (?<![95|98|NT|2000])Windows, 匹配非2000后面的Windows
以?开头的, 分组不能拿到pattern的值
=是匹配pattern
!是不匹配pattern
表达式中包含<的, 更适合匹配表达式后面的
正则表达式-- (?:pattern)与(?=pattern)的区别 - 銀色飞行船 - 博客园
=======================================================
排除某个单词, 的任意一行
^((?!hello).)*$