正則表達式 — 環(huán)視

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

環(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)的正則表達式的功能為:

  1. ,左側(cè)一定要有數(shù)字;
  2. 從右往左每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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容