正則表達式中的「環視」及實際項目應用
什麼是環視(lookaround)?
- 環視結構不匹配任何字符,只匹配文本中的特定位置,這一點與單詞分界符b、錨點^以及$類似,可是環視比它們更加通用,而且可以檢測兩側文本。
- 環視的四種類型:
1)順序環視-確定(從左至右查看文本):表達式爲(?=……),匹配成功的條件爲表達式可以匹配右側文本,好比(?=d)
2)順序環視-否認(從左至右查看文本):表達式爲(?!......),匹配成功的條件爲表達式不能匹配右側文本,好比(?!d)
3)逆序環視-確定(從右至左查看文本):表達式爲(?<=……),匹配成功的條件爲表達式可以匹配左側文本,好比(?<=d)
4)逆序環視-否認(從右至左查看文本):表達式爲(?<!......),匹配成功的條件爲表達式不能匹配左側文本,好比(?<!)=)
環視在我的經歷項目中的兩個實際應用:
- 團隊管理中檢測對於指定項目的權限:項目中咱們是用相似
38:1,749:0,188:1
這樣的字符串來存儲團隊普通成員對於各用戶項目的權限,好比其中749表明ID爲749的用戶項目,冒號標記符後跟隨的0數字表示具備查看權限,1數字則表示兼具查看和設置權限,多個用戶項目權限標記間以逗號分隔,若是對於一個用戶項目沒有任何權限,則整個權限字符串中將不會出現該項目ID。基本結構定了以後,那麼咱們其中一個相似的查找檢測權限問題是,已知用戶權限字符串,檢測對於指定項目好比749是否具備設置權限,在這裏的問題情境其實就是檢測用戶權限字符串中是否包含749:1
這個子字符串。能夠有以下幾種解決方式:
1)能夠不用正則表達式,先以逗號做爲分隔符拆分權限字符串,能夠獲得一個數組,該數組每個元素爲相似749:1
這樣的單個項目權限標記子字符串,再檢測這個數組中是否存在749:1
這一元素項。
2)匹配749:1出現狀況的正則表達式爲^749:1|,749:1
,進一步能夠簡化爲(^|,)749:1
(注意:一個小陷阱,想一想這裏若是不使用正則表達式匹配,而只使用普通字符串749:1做爲要查找匹配的目標會出現什麼問題?)。
3)利用環視的正則表達式爲(?<!\d)749:1
(咱們知道D表示非數字,那麼這裏表達式若是修改成(?<=\D)749:1
是否能夠正常工做?)。
- 千分位格式化數值(各分析頁中各指標塊數據用JavaScript進行逗號格式化):例如咱們須要將數值298444215格式化爲298,444,215,正常思惟是從這個數的右邊開始,每次數3位數字,若是左邊還有數字的話,就加入一個逗號。若是咱們能把這種思路直接用到正則表達式中固然很好,惋惜正則表達式通常都是從左向右工做的。不過變換下思路,逗號應該加在「左邊有數字,右邊數字的個數正好是3的倍數的位置」,這樣就可使用環視來解決這個問題了。初步的正則表達式爲:
(?<=\d)(?=(\d\d\d)+$)
,並結合開發語言的replace替換功能進行全局匹配替換。(想一想這裏若是去掉$結果會如何?)遺憾的是,JavaScript不支持逆序環視,所以若是要使用JavaScript中的正則表達式進行處理,剛剛的匹配正則表達式就須要修改成:(\d)(?=(\d\d\d)+$)
,並須要結合對捕獲型括號的反向引用$1進行全局匹配替換。
歡迎關注本站公眾號,獲取更多信息