如何正確理解正則表達式中的分隔符 \b


前言:好久不見,博客園。

最近在學習研究regex,其中有個特迷惑自己的知識點是分隔符 ( word boundary) [\b] (注:為了方便,后文都以[]來包含字符,並不是reg規則里面的[] ),后面查詢咨詢了解,明白了,記錄下來,希望幫到恰好迷惑的你。

[\b] 官方解釋是:Match a word boundary,匹配一個單詞邊界,也就是單詞和空格之間的位置,它本身不匹配任何字符。一般它有三種情況,如下:

  1. 在一個 \w 字符之前,eg:  \bend
  2. 在一個 \w 字符之后,eg: end\b
  3. 在兩個字符之間 ;

情況1,2都比較容易理解,這里就略過,主要從第3種情況來講講理解。

最開始從網上看到這樣一句話:“如果需要更精確的說法,[\b] 匹配這樣的位置:它的前一個字符和后一個字符不全是(一個是,一個不是或不存在) [\w] (匹配字母或數字或下划線或漢字)”;

那做個試驗:

    var reg = /end\band/g;
    var string = 'wenkend,end,and,endend';
    alert( reg.test(string) ) ; //false

根據上述理解 [\b] 要求它分隔的是一邊是 [\w] , 一邊是非 [\w]。我最開始理所當然的理解為正則表達式 [ end\band ] 匹配字符串 [end,and]  end的右邊是分隔符 [,]  ,符合匹配,and的左邊是分隔符 [,] , 符合匹配。那么它就應該符合匹配,可是為什么結果是 false 呢?

后面發現自己大錯特錯。

正確理解如下分三步來理解:

-----------------
/end\band/g,   "end,and"        (匹配end,true)
   |              |
-----------------

/end\band/g,   "end,and"        (匹配end后面是否有分隔符,有[,] - true)
     |             |
------------------

/end\band/g,   "end,and"        (now,接下來匹配的是否是字符and,因為 [\b]只是匹配匹配一個位置,本身並不匹配任何字符,所以
                                 等待匹配的字符串應該是 [,and] ,而不是[and],顯而易見,[,and] 並不符合匹配規則 [and] - false

總結來說就是:[end\band] 或者其他類似這樣的正則表達式是沒有意義的,可以說永遠也不會存在的。

如果 [\b] 在中間,regex表達式寫法必須遵循在 [\b] 的左右兩側一個是[\w],一個是非 [\w],例如 [end\,] . 

如有錯誤或疑問或建議,請指正,謝謝~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM