开发者

Regex for matching full word starting with # (Javascript)

开发者 https://www.devze.com 2023-01-18 06:45 出处:网络
I want to match a separate word which starts with # character. enter #code here - #code some#string here - nothing

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"
0

精彩评论

暂无评论...
验证码 换一张
取 消