正则表达式中:?=、?<=、?!、?<! 的用法详细说明
在正则表达式中,?=, ?<=, ?!, 和 ?<! 是 零宽度断言(lookaround assertions)的一部分。它们用于在匹配过程中进行某种条件判断,但并不会消耗字符(即不包括在最终的匹配结果中)。下面我将详细介绍它们的用法:
1. ?=: 正向前瞻(Positive Lookahead)
正向前瞻 ?= 用于匹配某个位置,要求其后面跟着某个模式,但不会包含该模式。
语法:
X(?=Y)- 这个模式会匹配字符
X,但只有在字符X后面跟着Y时才会匹配。 Y不会被包含在匹配结果中。
- 这个模式会匹配字符
- 示例:
$pattern = '/\d(?=\D)/';
$string = "123a456";
preg_match($pattern, $string, $matches);
print_r($matches);在这个例子中,(?=\D) 是一个正向前瞻,它检查数字后面是否跟着非数字字符。最终匹配的结果是数字 3,因为它后面是字母 a,符合条件。
2. ?<=: 反向前瞻(Positive Lookbehind)
反向前瞻 ?<= 用于匹配某个位置,要求其前面是某个模式,但不会包含该模式。
语法:
(?<=Y)X- 这个模式会匹配字符
X,但只有在字符X前面是Y时才会匹配。 Y不会被包含在匹配结果中。
- 这个模式会匹配字符
- 示例:
$pattern = '/(?<=\d)a/';
$string = "123a456";
preg_match($pattern, $string, $matches);
print_r($matches);在这个例子中,(?<=\d) 是一个反向前瞻,它检查字母 a 前面是否是数字。最终匹配的结果是字母 a,因为它前面是数字 3,符合条件。
3. ?!: 负向前瞻(Negative Lookahead)
负向前瞻 ?! 用于匹配某个位置,要求其后面不跟着某个模式。
语法:
X(?!Y)- 这个模式会匹配字符
X,但只有在字符X后面不跟着Y时才会匹配。 Y不会被包含在匹配结果中。
- 这个模式会匹配字符
- 示例:
$pattern = '/\d(?!\d)/';
$string = "123a456";
preg_match($pattern, $string, $matches);
print_r($matches);在这个例子中,(?!\d) 是一个负向前瞻,它检查数字后面是否不跟着另一个数字。最终匹配的结果是数字 3,因为它后面跟着字母 a,不符合 \d(数字)模式。
4. ?<!: 负向反向前瞻(Negative Lookbehind)
负向反向前瞻 ?<! 用于匹配某个位置,要求其前面不是某个模式。
语法:
(?<!Y)X- 这个模式会匹配字符
X,但只有在字符X前面不是Y时才会匹配。 Y不会被包含在匹配结果中。
- 这个模式会匹配字符
- 示例:
$pattern = '/(?<!\d)a/';
$string = "123a456";
preg_match($pattern, $string, $matches);
print_r($matches);在这个例子中,(?<!\d) 是一个负向反向前瞻,它检查字母 a 前面是否不是数字。最终匹配的结果是字母 a,因为它前面是字母 3,符合条件。
总结
| 断言 | 描述 | 示例 | 匹配内容 |
|---|---|---|---|
?= | 正向前瞻:匹配后面跟着某个模式的位置 | \d(?=\D) | 数字后跟非数字 |
?<= | 反向前瞻:匹配前面是某个模式的位置 | (?<=\d)a | 数字后面的字母 a |
?! | 负向前瞻:匹配后面不跟某个模式的位置 | \d(?!\d) | 单个数字后不是数字 |
?<! | 负向反向前瞻:匹配前面不跟某个模式的位置 | (?<!\d)a | 非数字前面的字母 a |
这些零宽度断言非常有用,可以在不影响匹配的内容的情况下,进行更灵活的条件判断,帮助你精确控制正则匹配的范围。
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1276.html
转载时须注明出处及本声明