I want to match a separate word which starts with # character.
enter #code here - #code
some#string here - nothing
#test - #test
I came up with follow开发者_运维技巧ing regex:
"enter #code here".replace(/\b#[\w]*/gi, "REPLACED")
But it doesn't work. After some testing i found that
"enter #code here".replace(/#\b[\w]*/gi, "REPLACED")
works just fine.
Now can someone explain why \b# part is incorrect in this case?
Thanks!
\b
is a transition between a non-word character and a word character, or vice-versa. Because a '#'
is not a word character, your first expression will only match a string that has a word character directly before the #
.
What might work is the expression /(\W)#[\w]*/gi
, because your second example will match any of those three strings. Use a backreference to put the non-word character from the match expression into the replacement.
The change between the #
and [\w]
is a non-word transition to word boundary, so \b
matches that, but a space to #
is not a boundary transition.
Your "works just fine" regex incorrectly replaces the "#string" in some#string here
where you say it shouldn't: "some#string here".replace(/#\b[\w]*/gi, "REPLACED");
gave me "someREPLACED here"
What I think you want is whitespace vs. non-white with the 'sharp' (and you don't need the brackets around the \w
) so the regex I came up with is
>>> "enter #code here".replace(/(\W)#\w*/gi, "$1REPLACED");
"enter REPLACED here"
>>> "some#string here".replace(/(\W)#\w*/gi, "$1REPLACED");
"some#string here"
精彩评论