引用網上一段話:
\b 是正則表達式規定的一個特殊代碼(好吧,某些人叫它元字符,metacharacter),代表着單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是 \b 並不匹配這些單詞分隔字符中的任何一個,它只匹配一個位置。
如果需要更精確的說法,\b 匹配這樣的位置:它的前一個字符和后一個字符不全是(一個是,一個不是或不存在) \w。
很多人不怎么理解正則中的 \b 含義,看到上面一段話后,很多人還是不怎么理解 \b 究竟是怎樣的一個“位置”。
今天就來說說我的理解。
什么是位置
It's a nice day today.
'I' 占一個位置,'t' 占一個位置,所有的單個字符(包括不可見的空白字符)都會占一個位置,這樣的位置我給它取個名字叫“顯式位置”。
注意:字符與字符之間還有一個位置,例如 'I' 和 't' 之間就有一個位置(沒有任何東西),這樣的位置我給它取個名字叫“隱式位置”。
“隱式位置”就是 \b 的關鍵!通俗的理解,\b 就是“隱式位置”。
此時,再來理解一下這句話:
如果需要更精確的說法,\b 匹配這樣的位置:它的前一個字符和后一個字符不全是(一個是,一個不是或不存在) \w。
我用我的話來翻譯一下這句話:
“隱式位置” \b,匹配這樣的位置:它的前一個“顯式位置”字符和后一個“顯式位置”字符不全是 \w。
此刻,有沒有一種豁然開朗的感覺?有么有?有么有?有么有?
實例講解
就用 "It's a nice day today." 舉例說明:
正確的正則:\bnice\b
分析:第一個 \b 前面一個字符是空格,后面一個字符是 'n',不全是 \w,所以可以匹配出 'n' 是一個單詞的開頭。第二個 \b 前面一個字符是 'e',后面一個字符是空格,不全是 \w,可以匹配出 'e' 是一個單詞的結尾。所以,合在一起,就能匹配出以 'n' 開頭以 'e' 結尾的單詞,這里就能匹配出 "nice" 這個單詞。
錯誤的正則:a\bnice
分析:我見過有人類似於這樣來寫正則,想要達到的目的是匹配出上一個單詞以 'a' 結尾,下一個單詞以 'n' 開頭的部分,這里想匹配出 "a nice"。但是這個正則表達的可不是這個目的,\b 前面是字符 'a',后面是字符 'n',兩個都是“顯式字符”,顯然違背了 \b 的含義,所以這就是個錯誤的表達式,匹配不出任何東西。想要匹配出 "a nice",正確的正則寫法是:a\b.\bnice(不能換行)