环视不匹配任何字符, 只匹配文本中的特定的位置 , 类似 b , ^ , $ 那样. 环视不会占用字符
环视分为顺序和逆序两种.
顺序
[?=exp] 位置的后面能匹配exp. 例如: (?\d) 当前位置右边是数字.
[?!exp] 位置的后面不能匹配exp. 例如: (?!\d) 当前位置右边不是数字.
逆序
[?<=exp] 位置的前面能匹配exp. 例如 (?<=\d) 当前位置左边是数字.
[?<!exp] 位置的前面不能匹配exp. 例如 (?<!\d) 当前位置左边不是数字.
光是看上面的内容可能不会太了解, 那一道经典面试题 说明
银行存款金额 后面三位用 '`' 替换
<?php
$num = '12345678901';
echo preg_replace('/(?<=\d)(?=(\d{3})+$)/', '`', $num);
12`345`678`901
(?<=d)(?=(d{3})+$) 和 (?=(\d{3})+$)(?<=d) 这两个反正数字是一样的
实际上这些正则用正确的方法是很容易就可以解决的.*
首先 注意的事项是:
- 左侧一定要有数字
- 每三个都需要添加 '`' 符号
那写出正则可以分部写出来 一步一步进化
(?=d{3}) 右侧必须有三个数字
`1`2`3`4`5`6`7`8`901
(?=(d{3})$) 三个数字结尾
12345678`901
(?=(d{3})+$) 三个数字及三个数字结尾
12`345`678`901
这是后看似都解决了问题 但是 如果数字长度为3的整数呢
`123`456`789`012
所以还需要 左侧做出限制
(?<=d)(?=(d{3})+$) 左侧需要有1到多个数字
123`456`789`012
本文均源于 四脚猫 视频课程