2010-09-27 143 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