前言:好久不見,博客園。
最近在學習研究regex,其中有個特迷惑自己的知識點是分隔符 ( word boundary) [\b] (注:為了方便,后文都以[]來包含字符,並不是reg規則里面的[] ),后面查詢咨詢了解,明白了,記錄下來,希望幫到恰好迷惑的你。
[\b] 官方解釋是:Match a word boundary,匹配一個單詞邊界,也就是單詞和空格之間的位置,它本身不匹配任何字符。一般它有三種情況,如下:
- 在一個 \w 字符之前,eg: \bend
- 在一個 \w 字符之后,eg: end\b
- 在兩個字符之間 ;
情況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\,] .
如有錯誤或疑問或建議,請指正,謝謝~