正则表达式中?=和?:和?!的理解

本文详细介绍了正则表达式中的前瞻、后顾、负前瞻、负后顾等概念,并通过实例展示了如何使用这些特性进行精准匹配。此外,还解释了捕获分组和非捕获分组的区别及应用场景。

要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:

前瞻:
exp1(?=exp2) 查找exp2前面的exp1
后顾:
(?<=exp2)exp1 查找exp2后面的exp1
负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
负后顾:
(?<!=exp2)exp1 查找前面不是exp2的exp1

举例:

"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr
"法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到

要理解?:则需要理解捕获分组和非捕获分组的概念:

()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来

举例:

// 数字格式化 1,123,000
"1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",") // 结果:1,234,567,890,匹配的是后面是3*n个数字的非单词边界(\B)

 

### 正则表达式中的断言 lookahead 示例解释 #### 基本概念 正则表达式是一种用于匹配字符串模式的强大工具[^2]。其中,断言(assertions)允许指定某些条件必须满足,但这些条件本身不消耗字符。前瞻断言(lookahead assertions)属于此类特性之一。 #### 展示具体实例 考虑两个不同的正则表达式理解前瞻断言的作用: - **常规正则表达式**: `/f(o)o/` 这里括号仅是为了视觉上的清晰度,并无特殊含义。此表达式会匹配任何包含 "foo" 的位置,并捕获中间的 'o' 字符作为子组[^1]。 - **带有前瞻断言的正则表达式**: `/f(?=o)o/` 表达式 `(?=...)` 是一个零宽正向肯定预查,在这里指定了紧随其后的字符应该是'o',但它不会成为最终匹配的一部分;因此整个表达式实际上仍然只匹配 "fo"。 对于更复杂的案例,比如 `\b\w+\b(?!.+and.+)`: - `\b`: 匹配单词边界; - `\w+`: 匹配至少一个由字母、数字或下划线组成的序列; - `(?!...)`: 负预测先行断言,意味着在此处之后不应存在能够被内部模式 `.+.and.+` 所匹配的内容[^4]。 这意味着该表达式将成功匹配那些不在其他含有 "and" 单词之前的独立单词。 ```python import re pattern = r'\b\w+\b(?!.+and.+)' test_string = "hello world and another example" matches = re.findall(pattern, test_string) print(matches) ``` 这段 Python 代码展示了如何应用上述复杂正则表达式去查找符合条件的所有词语。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值