?:pattern ?=pattern ?!pattern 的理解

本文详细解析了正则表达式的几种特殊模式,包括非获取匹配、正向预查及负向预查等,并通过示例帮助理解这些模式的用途。

首先给一个官方解释吧:

(pattern)  
 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘′或‘’。  
   
(?:pattern)  
 匹 配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。  
   
(?=pattern)  
 正 向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,‘Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000〃 中的 “Windows” ,但不能匹配 “Windows 3.1〃 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。  
   
(?!pattern)  
 负 向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如‘Windows (?!95|98|NT|2000)’ 能匹配 “Windows 3.1〃 中的 “Windows”,但不能匹配 “Windows 2000〃 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始   
  
在PERL的模式中,括号内的子模式将存贮在内存中,此功能即取消存贮该括号内的匹配内容,如/(?:a|b|c)(d|e)f\1/中的\1表示已匹配的d或e,而不是a或b或c  

不用看了,我知道你看不懂,看的懂就不来查了。我就给三张图,看看能不能理解吧,已经是我觉得最好理解的了,文字我都打不出这么好理解的:

?:pattern  



?=pattern



?!pattern




ok,正则表达式这东西,还是直接测试理解的快哈


### 正则表达式中 (?!pattern) 和 (?!=pattern) 的区别与用法 正则表达式中的 `(?!pattern)` 和 `(?!=pattern)` 是两种用于零宽断言的结构,但它们在语法和语义上存在差异。 #### 1. `(?!pattern)` 的含义与用法 `(?!pattern)` 是一个负向前瞻(negative lookahead)[^4]。它表示在当前位置之后,**不能匹配指定的模式 `pattern`**。如果满足这个条件,则继续匹配后续内容;否则,匹配失败。 - **特点**:不消耗字符,仅检查当前匹配位置之后的内容是否不符合 `pattern`。 - **使用场景**:当需要确保某个位置之后的内容不包含特定模式时,可以使用负向前瞻。 以下是一个示例代码,展示如何使用 `(?!pattern)`: ```python import re # 匹配以 "abc" 开头但后面不是 "def" 的字符串 pattern = r"^abc(?!def)" test_string = "abcdef" result = re.match(pattern, test_string) print(bool(result)) # 输出: False test_string = "abcxyz" result = re.match(pattern, test_string) print(bool(result)) # 输出: True ``` #### 2. `(?!=pattern)` 的含义与用法 `(?!=pattern)` 并不是标准正则表达式的一部分[^4]。在大多数编程语言和工具中,这种写法是无效的或会导致语法错误。因此,严格意义上来说,`(?!=pattern)` 并不存在。 如果用户误以为 `(?!=pattern)` 是一种有效的正则表达式结构,可能是对 `(?!pattern)` 的误解。实际上,所有相关的功能都可以通过 `(?!pattern)` 实现。 #### 3. 区别总结 | 特性 | `(?!pattern)` | `(?!=pattern)` | |---------------------|----------------------------------------|--------------------------------------| | **有效性** | 标准正则表达式支持 | 非标准,通常无效 | | **功能** | 负向前瞻,确保后方内容不匹配 `pattern` | 无实际意义,无法实现预期功能 | | **使用场景** | 确保某位置之后的内容不符合特定模式 | 不适用 | #### 示例对比 以下代码展示了 `(?!pattern)` 的正确用法,并验证了 `(?!=pattern)` 的无效性: ```python import re # 使用 (?!pattern) pattern1 = r"abc(?!def)" test_string1 = "abcdef" result1 = re.match(pattern1, test_string1) print(bool(result1)) # 输出: False test_string1 = "abcxyz" result1 = re.match(pattern1, test_string1) print(bool(result1)) # 输出: True # 尝试使用 (?!=pattern) try: pattern2 = r"abc(?!=def)" re.compile(pattern2) except re.error as e: print(f"Error: {e}") # 输出: Error: bad escape ( at position ... ``` 从上述代码可以看出,`(?!pattern)` 是有效且常用的结构,而 `(?!=pattern)` 则会导致编译错误。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值