我想匹配一个以#character开头的单词。
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#part在这种情况下不正确吗?
谢谢!
答案 0 :(得分:2)
\b
是非单词字符和单词字符之间的过渡,反之亦然。由于'#'
不是单词字符,因此您的第一个表达式只匹配在#
之前直接包含单词字符的字符串。
可能有效的是表达式/(\W)#[\w]*/gi
,因为你的第二个例子将匹配这三个字符串中的任何一个。使用反向引用将匹配表达式中的非单词字符放入替换表单中。
答案 1 :(得分:1)
#
和[\w]
之间的变化是字词边界的非单词过渡,因此\b
与之匹配,但#
的空格不是边界过渡。
你的“工作正常”正则表达式错误地替换了some#string here
中的“#string”,你说它不应该:"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"