環(huán)視 是正則中的一個難點,但是在實際應用中使用起來卻很方便。環(huán)視 不匹配文本中的任何字符,只匹配文本中的 特定位置 。環(huán)視類似于定位符^、$、\b,不會占用字符。
環(huán)視分為 順序環(huán)視 和 逆序環(huán)視 兩種。
順序環(huán)視
類型 正則表達式 匹配成功的條件
肯定順序環(huán)視 (?=exp) 子表達式能夠匹配 右側(cè) 文本
否定順序環(huán)視 (?!exp) 子表達式不能匹配 右側(cè) 文本
順序環(huán)視會檢查子表達式exp 能否匹配成功,且 只尋找子表達式匹配成功時 左側(cè) 位置,即子表達式能夠匹配右側(cè)文本。
小試牛刀
下面需要將每個操作系統(tǒng)用,分隔,正則表達式為(?=Win),實現(xiàn)代碼如下:
$need = 'CentOS7Win7Win10';
$need = preg_replace('/(?=Win)/', ',', $need);
echo $need, PHP_EOL;
替換后的文本字符串為:
CentOS7,Win7,Win10
逆序環(huán)視
類型 正則表達式 匹配成功的條件
肯定逆序環(huán)視 (?<=exp) 子表達式能夠匹配 左側(cè) 文本
否定逆序環(huán)視 (?<!exp) 子表達式不能匹配 左側(cè) 文本
逆序環(huán)視同樣會檢查子表達式exp 能否匹配成功,且** 只尋找子表達式匹配成功時 右側(cè) 位置**,即子表達式能夠匹配左側(cè)文本。
小試牛刀
這里繼續(xù)將上例中的系統(tǒng)名和版本之間用-分隔,正則表達式為(?<=(CentOS|Win)),代碼如下:
$need = preg_replace('/(?<=CentOS|Win)/', '-', $need);
echo $need, PHP_EOL;
輸出為:
CentOS-7,Win-7,Win-10
經(jīng)典例子
需求:銀行為了方便用戶查閱存款金額,需要將存款金額整數(shù)部分從右往左每隔3位數(shù)字用 , 分隔。即12345需要顯示為12,345。
實現(xiàn)需求前,分析要實現(xiàn)的正則表達式的功能為:
,左側(cè)一定要有數(shù)字;- 從右往左每3位數(shù)字需要插入
,字符;
先寫出能從右往左匹配每3位數(shù)字的 左側(cè) 位置的正則表達式,可知是 順序環(huán)視 正則:
(?=(\d{3})+$)
該正則表達式在存款位數(shù)為3的整數(shù)倍時,也會在首位數(shù)字前添加,字符,所以需要限定為數(shù)字的 右側(cè) 位置才添加,字符,使用 逆序環(huán)視 正則為:
(?<=\d)
故,總的正則表達式為:
(?<=\d)(?=(\d{3})+$)
或
(?=(\d{3})+$)(?<=\d)
最后,實現(xiàn) 代碼 為:
$need = '123456';
$need = preg_replace('/(?<=\d)(?=(\d{3})+$)/', ',', $need);
echo $need, PHP_EOL;
運行結(jié)果:
123,456