在正则表达式中,?=, ?<=, ?!, 和 ?<!零宽度断言(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

这些零宽度断言非常有用,可以在不影响匹配的内容的情况下,进行更灵活的条件判断,帮助你精确控制正则匹配的范围。

标签: none

添加新评论