2010-09-27 63 views
1

我想配一個單獨的詞與#字符開始。正則表達式匹配完整的單詞,從第(JavaScript)的

enter #code here - #code 
some#string here - nothing 
#test - #test 

我想出了下面的正則表達式:

"enter #code here".replace(/\b#[\w]*/gi, "REPLACED") 

但它不工作。經過一番測試,我發現

"enter #code here".replace(/#\b[\w]*/gi, "REPLACED") 

工作得很好。

現在有人可以解釋爲什麼\ B#部分是在這種情況下,不正確的?

謝謝!

回答

2

\b是一個非文字字符和單詞字符,或反之亦然之間的轉變。由於'#'是不發一言的性格,你的第一個表達式將只匹配具有#之前直接單詞字符的字符串。

什麼可能的工作是表達/(\W)#[\w]*/gi,因爲你的第二個例子將匹配任何這三個串。使用反向引用將匹配表達式中的非單詞字符放入替換中。

+0

謝謝你的解釋。 – 2010-09-27 20:06:16

+1

如果你的引擎支持它(JavaScript不),你可以使用[回顧後(http://www.regular-expressions.info/lookaround.html),而不是捕獲組不捕捉'\ W' :'/(?<= \ W)#[\ w] */gi' – 2010-09-27 20:18:30

1

#[\w]之間的變化是一個無字過渡到字邊界,所以\b匹配,但#空間不是邊界變遷。

你「的作品就好了」正則表達式替換不正確的「#string」在some#string here,你說這不應該:"some#string here".replace(/#\b[\w]*/gi, "REPLACED");給我"someREPLACED here"

我想你想要什麼是空白與非白人與'尖銳'(並且你不需要圍繞\w的括號),所以我想出的正則表達式是

>>> "enter #code here".replace(/(\W)#\w*/gi, "$1REPLACED"); 
"enter REPLACED here" 
>>> "some#string here".replace(/(\W)#\w*/gi, "$1REPLACED"); 
"some#string here" 
+0

謝謝您的解釋,我錯誤地理解了\ b字符。 – 2010-09-27 20:07:22

相關問題