上一篇文章《正則表達式匹配素數的原理講解》寫完以後,一些同窗給我留言說對於正則表達式的環視不是很理解;但願我可以講解一下關於環視部分的內容。那麼這篇文章的目的就是幫助你們理解什麼是環視,環視有什麼做用,以及在實際的開發中的一些例子。相信閱讀本文以後,你們對於正則的環視會有更深刻的理解。前端
環視顧名思義就是環顧四周,向左看看向看看,找一個合適的位置。環視匹配的是一個位置而不是字符,這點尤其重要。git
那麼咱們是怎麼找到這個合適的位置的呢?固然是根據環視裏面包含的條件去尋找這個位置。接下來我會用生活中的一些場景來解釋每一種環視。github
假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,你記性很差忘記了本身以前的位置,可是你還記得你的後面是李四。因此這個時候你確定先找到李四,而後站在他的前面就能夠了。因此你這個選擇背後的邏輯是,我站的這個位置後面須要是李四才能夠,咱們能夠用下面這個圖來表示你的選擇。正則表達式
若是咱們使用正則表達式來表示這個位置的話,那就是(?=李四)
,這就表示了你想要找的位置。app
首先解釋一下什麼是順序環視,什麼是逆序環視。由於正則表達式的匹配過程是從左到右的,因此若是咱們要判斷一個位置的右邊滿不知足某個條件,這就叫順序環視。若是咱們判斷一個位置的左邊滿不知足某種條件的話,這就叫作逆序環視。學習
你可能會以爲上面這個正則表達式有點難記,首先咱們須要知道環視都是以(?
做爲開頭的,而後接下來的一到兩個符號代表是那種環視,再而後就是須要知足的條件,最後是一個)
表示結束。(?=條件)
能夠這樣理解,?
表示疑問,=
表示是否知足匹配。也就是當前位置是否知足給出的條件。spa
咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置呢?3d
假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,可是你不想讓李四站在你的後面,由於他老是喜歡用中性筆在你的後背上亂塗亂畫😂。因此這個時候你會怎麼選擇位置呢?你確定先看一個位置,只要這個位置的後面不是李四就能夠了。由於就算李四在你前面也無所謂,畢竟他不能畫你的後背了。code
因此你作這個選擇背後的邏輯是,只有你站的這個位置後面不是李四才能夠。咱們能夠用下面這個圖來表示你的選擇。blog
上面這個位置能夠用正則表達式(?!李四)
來表示,做爲程序開發者,咱們對!
很熟悉,在這裏也是一樣的意思。表示不可以知足後面的條件。
咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置。
假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,你記性仍是很很差忘記了本身以前的位置,可是你還記得你前面是李四。因此這個時候你確定先找到李四,而後站在他的後面就能夠了。因此你這個選擇背後的邏輯是,我站的這個位置前面須要是李四才能夠。
咱們能夠用下面這個圖來表示你的選擇。
若是咱們使用正則表達式來表示這個位置的話,那就是(?<=李四)
,這就表示了你想要找的位置。(?<=條件)
能夠這樣理解,?
表示疑問,<
表示方向是當前位置的左邊,=
表示是否知足匹配。也就是當前位置的左邊是否知足給出的條件。
咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置。
假如你如今是一名叫張三的學生,如今是體育課須要你們排個隊,你是一個比較調皮的孩子,總喜歡在李四的後背上亂塗輪畫😂。如今老師說你站在那裏均可以,可是就是不可讓李四站在你的前面。
這時候你該如何選擇,你確定先找一個位置,而後肯定你前面不是李四就能夠了。哪怕李四在你的後面,你也不可以在李四的後背上亂塗亂畫了。
因此你這個選擇背後的邏輯是,我站的這個位置前面不可以是李四才能夠。咱們能夠用下面這個圖來表示你的選擇。
若是咱們使用正則表達式來表示這個位置的話,那就是(?<!李四)
,這就表示了你想要找的位置。(?<!條件)
能夠這樣理解,?
表示疑問,<
表示方向是當前位置的左邊,!
表示不匹配。也就是當前位置的左邊不可以匹配給出的條件。
咱們來實踐一下吧,假如b表示李四,你可否找出張三須要站的位置。
若是你看到得了到這裏,那麼你應該知道了這四種環視的表示方法,和它們表示的含義了。接下來咱們來看一下環視在實際開發中的應用吧。
在實際的開發中,做爲一個前端,常常須要把原始數據處理的美觀一些,而後再展現給用戶,數字的千分位添加逗號就是一個很常見的需求。
這個問題的解決方案有不少種,使用正則表達式來解決這個問題是個很不錯的方案。並且這個正則表達式要使用到咱們今天學習的環視。那麼咱們該怎麼使用環視去解決這個問題呢?
當咱們使用正則表達式去解決問題的時候,第一件事情就是須要明確解決的是一個什麼問題。對於這個問題來講,咱們要解決的問題是匹配一些位置。什麼位置?就是一個數字,從後向前數,每隔三個數字的位置,而且每一個位置的左邊都須要有數字。
當咱們明確了咱們須要解決的問題以後,咱們就能夠寫咱們的正則表達式。首先寫一個可以匹配每隔三個數字的位置。這個比較容易咱們可使用確定的順序環視,(?=\d{3})
應該是咱們比較容易想到的。這個正則表示的意思就是匹配一個位置,這個位置的後面須要是三個數字。咱們能夠看一下咱們匹配的結果。
知足上面條件的位置有好幾個,可是有一些不是咱們想要的。好比5和6之間的位置就不是咱們想要的,可是由於這個位置後面是678
,也知足咱們上面的正則表達式,因此是可以匹配的。那麼咱們應該如何排除這些不想要的位置呢?
還有一個隱藏的條件,那就是咱們還須要匹配字符串的結尾。若是咱們把上面的正則表達式修改成(?=\d{3}$)
,這樣就限定了咱們匹配的位置,這個位置的後面是三個數字,而後就是字符串的結尾。咱們看一下這個表達式的匹配結果。
當咱們限定了最開始匹配的位置以後,如今就找到了一個正確的位置。可是尚未達到咱們的要求,咱們還須要找到3和4之間的位置。這個時候咱們可使用量詞來解決這個問題,咱們知道3和4之間的位置距離字符串的結尾有6個數字,是3的倍數,因此咱們須要可以匹配數字的個數是三、六、9等,只要是3的倍數就能夠。因此咱們能夠將上面的表達式修改成(?=(\d{3})+$)
,+
做用於前面括號括起來的\d{3}
,表示至少須要有一個\d{3}
。咱們來看一下此次表達式的匹配結果。
此次的匹配結果好像還有點問題,那就是數字的開頭也被匹配了,可是這不是咱們想要的結果。那麼咱們應該怎麼處理呢?一些同窗可能會說,咱們只要保證每個的位置左邊至少有一個數字就能夠了。嗯,這個方法也是能夠的,按照這個思路,咱們會寫出下面的正則表達式(?<=\d)(?=(\d{3})+$)
。(?<=\d)
是確定的逆序環視,表示當前位置的左邊須要是一個數字。咱們來看一下這個正則表達式的匹配結果。
此次這個正則表達式終於知足了咱們的需求,匹配出了正確的位置。若是你以爲上面的正則表達式有點長的話,咱們還可使用\B
來替換掉(?<=\d)
。結果也是同樣的,聰明的你知道爲何嗎?在文章下面留言跟你們一塊兒分享你的看法吧。
關於正則表達式的環視到這裏就結束啦,若是你們有什麼疑問和建議均可以在這裏提出來。歡迎你們關注個人公衆號「關山不難越」,咱們一塊兒學習更多有用的正則知識,一塊兒進步。