距離弄懂正則的環視,你只差這一篇文章

環視.png

上一篇文章《正則表達式匹配素數的原理講解》寫完以後,一些同窗給我留言說對於正則表達式的環視不是很理解;但願我可以講解一下關於環視部分的內容。那麼這篇文章的目的就是幫助你們理解什麼是環視,環視有什麼做用,以及在實際的開發中的一些例子。相信閱讀本文以後,你們對於正則的環視會有更深刻的理解。前端

正則表達式的環視是什麼

環視顧名思義就是環顧四周,向左看看向看看,找一個合適的位置。環視匹配的是一個位置而不是字符,這點尤其重要。git

那麼咱們是怎麼找到這個合適的位置的呢?固然是根據環視裏面包含的條件去尋找這個位置。接下來我會用生活中的一些場景來解釋每一種環視。github

確定的順序環視

假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,你記性很差忘記了本身以前的位置,可是你還記得你的後面是李四。因此這個時候你確定先找到李四,而後站在他的前面就能夠了。因此你這個選擇背後的邏輯是,我站的這個位置後面須要是李四才能夠,咱們能夠用下面這個圖來表示你的選擇。正則表達式

(?=李四)

若是咱們使用正則表達式來表示這個位置的話,那就是(?=李四),這就表示了你想要找的位置。app

首先解釋一下什麼是順序環視,什麼是逆序環視。由於正則表達式的匹配過程是從左到右的,因此若是咱們要判斷一個位置的右邊滿不知足某個條件,這就叫順序環視。若是咱們判斷一個位置的左邊滿不知足某種條件的話,這就叫作逆序環視。學習

你可能會以爲上面這個正則表達式有點難記,首先咱們須要知道環視都是以(?做爲開頭的,而後接下來的一到兩個符號代表是那種環視,再而後就是須要知足的條件,最後是一個)表示結束。(?=條件)能夠這樣理解,?表示疑問,=表示是否知足匹配。也就是當前位置是否知足給出的條件。spa

咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置呢?3d

(?=b)

否認的順序環視

假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,可是你不想讓李四站在你的後面,由於他老是喜歡用中性筆在你的後背上亂塗亂畫😂。因此這個時候你會怎麼選擇位置呢?你確定先看一個位置,只要這個位置的後面不是李四就能夠了。由於就算李四在你前面也無所謂,畢竟他不能畫你的後背了。code

因此你作這個選擇背後的邏輯是,只有你站的這個位置後面不是李四才能夠。咱們能夠用下面這個圖來表示你的選擇。blog

(?!李四)

上面這個位置能夠用正則表達式(?!李四)來表示,做爲程序開發者,咱們對!很熟悉,在這裏也是一樣的意思。表示不可以知足後面的條件。

咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置。

(?!李四)

確定的逆序環視

假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,你記性仍是很很差忘記了本身以前的位置,可是你還記得你前面是李四。因此這個時候你確定先找到李四,而後站在他的後面就能夠了。因此你這個選擇背後的邏輯是,我站的這個位置前面須要是李四才能夠
咱們能夠用下面這個圖來表示你的選擇。

(?<=李四)

若是咱們使用正則表達式來表示這個位置的話,那就是(?<=李四),這就表示了你想要找的位置。(?<=條件)能夠這樣理解,?表示疑問,<表示方向是當前位置的左邊,=表示是否知足匹配。也就是當前位置的左邊是否知足給出的條件。

咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置。

(?&lt;=b)

否認的逆序環視

假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,你是一個比較調皮的孩子,總喜歡在李四的後背上亂塗輪畫😂。如今老師說你站在那裏均可以,可是就是不可讓李四站在你的前面。

這時候你該如何選擇,你確定先找一個位置,而後肯定你前面不是李四就能夠了。哪怕李四在你的後面,你也不可以在李四的後背上亂塗亂畫了

因此你這個選擇背後的邏輯是,我站的這個位置前面不可以是李四才能夠。咱們能夠用下面這個圖來表示你的選擇。

(?&lt;!李四)

若是咱們使用正則表達式來表示這個位置的話,那就是(?<!李四),這就表示了你想要找的位置。(?<!條件)能夠這樣理解,?表示疑問,<表示方向是當前位置的左邊,!表示不匹配。也就是當前位置的左邊不可以匹配給出的條件。

咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置。

(?&lt;!b)

若是你看到得了到這裏,那麼你應該知道了這四種環視的表示方法,和它們表示的含義了。接下來咱們來看一下環視在實際開發中的應用吧。

環視在實際開發中的應用

數字千分位的處理

在實際的開發中,做爲一個前端,常常須要把原始數據處理的美觀一些,而後再展現給用戶,數字的千分位添加逗號就是一個很常見的需求。

這個問題的解決方案有不少種,使用正則表達式來解決這個問題是個很不錯的方案。並且這個正則表達式要使用到咱們今天學習的環視。那麼咱們該怎麼使用環視去解決這個問題呢?

當咱們使用正則表達式去解決問題的時候,第一件事情就是須要明確解決的是一個什麼問題。對於這個問題來講,咱們要解決的問題是匹配一些位置。什麼位置?就是一個數字,從後向前數,每隔三個數字的位置,而且每一個位置的左邊都須要有數字。

當咱們明確了咱們須要解決的問題以後,咱們就能夠寫咱們的正則表達式。首先寫一個可以匹配每隔三個數字的位置。這個比較容易咱們可使用確定的順序環視(?=\d{3})應該是咱們比較容易想到的。這個正則表示的意思就是匹配一個位置,這個位置的後面須要是三個數字。咱們能夠看一下咱們匹配的結果。

(?=d{3})

知足上面條件的位置有好幾個,可是有一些不是咱們想要的。好比5和6之間的位置就不是咱們想要的,可是由於這個位置後面是678,也知足咱們上面的正則表達式,因此是可以匹配的。那麼咱們應該如何排除這些不想要的位置呢?

還有一個隱藏的條件,那就是咱們還須要匹配字符串的結尾。若是咱們把上面的正則表達式修改成(?=\d{3}$),這樣就限定了咱們匹配的位置,這個位置的後面是三個數字,而後就是字符串的結尾。咱們看一下這個表達式的匹配結果。

(?=d{3}$)

當咱們限定了最開始匹配的位置以後,如今就找到了一個正確的位置。可是尚未達到咱們的要求,咱們還須要找到3和4之間的位置。這個時候咱們可使用量詞來解決這個問題,咱們知道3和4之間的位置距離字符串的結尾有6個數字,是3的倍數,因此咱們須要可以匹配數字的個數是三、六、9等,只要是3的倍數就能夠。因此咱們能夠將上面的表達式修改成(?=(\d{3})+$)+做用於前面括號括起來的\d{3},表示至少須要有一個\d{3}。咱們來看一下此次表達式的匹配結果。

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

此次的匹配結果好像還有點問題,那就是數字的開頭也被匹配了,可是這不是咱們想要的結果。那麼咱們應該怎麼處理呢?一些同窗可能會說,咱們只要保證每個的位置左邊至少有一個數字就能夠了。嗯,這個方法也是能夠的,按照這個思路,咱們會寫出下面的正則表達式(?<=\d)(?=(\d{3})+$)(?<=\d)是確定的逆序環視,表示當前位置的左邊須要是一個數字。咱們來看一下這個正則表達式的匹配結果。

(?&lt;=d)(?=(d{3})+$)

此次這個正則表達式終於知足了咱們的需求,匹配出了正確的位置。若是你以爲上面的正則表達式有點長的話,咱們還可使用\B來替換掉(?<=\d)。結果也是同樣的,聰明的你知道爲何嗎?在文章下面留言跟你們一塊兒分享你的看法吧。

關於正則表達式的環視到這裏就結束啦,若是你們有什麼疑問和建議均可以在這裏提出來。歡迎你們關注個人公衆號「關山不難越」,咱們一塊兒學習更多有用的正則知識,一塊兒進步。

關山不難越

相關文章
相關標籤/搜索