正则表达式 — 环视

2017-06-17  本文已影响0人  Howborn

原文:https://www.fanhaobai.com/2017/01/regex-lookaround.html

环视 是正则中的一个难点,但是在实际应用中使用起来却很方便。环视 不匹配文本中的任何字符,只匹配文本中的 特定位置 。环视类似于定位符^$\b,不会占用字符。

环视分为 顺序环视逆序环视 两种。

顺序环视

   类型             正则表达式                    匹配成功的条件
肯定顺序环视     (?=exp)                  子表达式能够匹配 右侧 文本
否定顺序环视     (?!exp)                  子表达式不能匹配 右侧 文本

顺序环视会检查子表达式exp 能否匹配成功,且 只寻找子表达式匹配成功时 左侧 位置,即子表达式能够匹配右侧文本。

小试牛刀

下面需要将每个操作系统用,分隔,正则表达式为(?=Win),实现代码如下:

$need = 'CentOS7Win7Win10';
$need = preg_replace('/(?=Win)/', ',', $need);
echo $need, PHP_EOL;

替换后的文本字符串为:

CentOS7,Win7,Win10

逆序环视

   类型             正则表达式                   匹配成功的条件
肯定逆序环视    (?<=exp)               子表达式能够匹配 左侧 文本
否定逆序环视    (?<!exp)               子表达式不能匹配 左侧 文本

逆序环视同样会检查子表达式exp 能否匹配成功,且** 只寻找子表达式匹配成功时 右侧 位置**,即子表达式能够匹配左侧文本。

小试牛刀

这里继续将上例中的系统名和版本之间用-分隔,正则表达式为(?<=(CentOS|Win)),代码如下:

$need = preg_replace('/(?<=CentOS|Win)/', '-', $need);
echo $need, PHP_EOL;

输出为:

CentOS-7,Win-7,Win-10

经典例子

需求:银行为了方便用户查阅存款金额,需要将存款金额整数部分从右往左每隔3位数字用 , 分隔。即12345需要显示为12,345

实现需求前,分析要实现的正则表达式的功能为:

  1. ,左侧一定要有数字;
  2. 从右往左每3位数字需要插入,字符;

先写出能从右往左匹配每3位数字的 左侧 位置的正则表达式,可知是 顺序环视 正则:

(?=(\d{3})+$)

该正则表达式在存款位数为3的整数倍时,也会在首位数字前添加,字符,所以需要限定为数字的 右侧 位置才添加,字符,使用 逆序环视 正则为:

(?<=\d)

故,总的正则表达式为:

(?<=\d)(?=(\d{3})+$)
或
(?=(\d{3})+$)(?<=\d)

最后,实现 代码 为:

$need = '123456';
$need = preg_replace('/(?<=\d)(?=(\d{3})+$)/', ',', $need);
echo $need, PHP_EOL;

运行结果:

123,456
上一篇 下一篇

猜你喜欢

热点阅读