2013-12-24 99 views
2

我對/ \ w \ b \ w /很困惑。我認爲應該在 「我們,我們」 匹配 「EW」,因爲:正則表達式 -/ w b w/

\ w是單詞字符是 「E」

\ b爲詞broundary這是 「」(空格)

\ w是另一個詞,它是「w」

所以匹配是「我們我們」中的「ew」。 但是......

/\ W \ B \ W /永遠不會匹配任何東西,因爲一個單詞字符不能 後跟兩個非單詞和單詞字符。

我這一個從MDN:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions?redirectlocale=en-US&redirectslug=JavaScript%2FGuide%2FRegular_Expressions

我無法理解他們的解釋。你能幫我解釋一下寶貝嗎?謝謝!

  • 尼克
+0

爲什麼呢?我認爲\ w應該先\ b,然後\ w,一個接一個。 –

回答

2

關鍵是\b的意思。 \b匹配單詞邊界。單詞邊界與單詞字符未被跟隨或以另一個單詞字符開頭的位置匹配。請注意,匹配中不包含匹配的單詞邊界。換句話說,匹配的單詞邊界的長度是零。

所以\b本身不匹配任何東西,它只是一個條件,如^$等等。像/^\w/的意思是從字符開始,/\w\b/表示一個字符後面跟着一個字符。

"e w"/\w\b/只匹配"e"這一個字字符後面沒有字字符在這裏是自由了,但"e "

/\w\W/確實匹配"e ""e w"\b只是一個條件不匹配任何東西。

/\w\b\w/表示一個字 - 字符後跟一個非單詞和一個單詞 - 字符是矛盾的,所以永遠不會匹配任何東西。

5

空格字符不是單詞邊界。單詞邊界本身不是一個字符,它是「字符之間」的地方,一個單詞字符轉換爲一個非單詞字符。

所以"e w".match(/\w\b/)只匹配"e"而不是"e "

/\w\b\w/從來沒有匹配過任何東西,因爲它需要一個單詞字符後面緊跟着一個非單詞字符和一個單詞字符,這當然是不可能的。

+1

作爲參考,'\ b'是「零寬度斷言」的例子;它需要在表達式中的某個條件爲真,但它不會吃任何字符。 lookaheads,lookbehinds,'^'和'$'的工作原理都是一樣的(儘管JS可能不會有後顧之憂,現在我想到了)。 – cHao

+0

它沒有。 :)我想過提及'^'和'$',但認爲它可能會讓人困惑,因爲它們在字符串的末尾。 Lua的前沿模式是我能想到的另一個例子,但在這裏並不重要。 –

+0

非常感謝你對這個徹底的解釋! –

1

\w\b\w意味着匹配:

  1. 一個字母數字字符(\w);然後是
  2. 從字母數字字符到非字母數字字符(或反之亦然)('\ b')的轉換。但沒有任何實際的性格;其次是
  3. 字母數字字符(\w)。

關鍵是\b不會消耗任何字符,它會檢查哪些字符與測試位置相鄰。因此\w\b\w只匹配兩個字符,都必須是字母數字(\w),並且它們之間的虛擬點必須在一邊是字母數字,而在另一邊是非字母數字,因此無法匹配。

希望這會有所幫助。

1

如果它開始或結尾爲你的正則表達式將失敗的輸入"we we"因爲在大多數方言字邊界是\w和非字字符(\W)之間的位置,或在串的開頭或結尾一個字的字符。

你的正則表達式是這樣做的:

\w   word characters (a-z, A-Z, 0-9, _) 
\b   the boundary between a word char (\w) and not a word char 
\w   word characters (a-z, A-Z, 0-9, _) 

因此,它的樣子說對下面的字邊界的位置的單詞字符。如果您要刪除結尾\w,它將與輸入中的e匹配。

console.log("we we".match(/\w\b/)); 
// => [ 'e', index: 1, input: 'we we' ] 
相關問題