Javascript中不包括连字符的单词边界
我喜欢Javascript中不包括连字符的单词边界,javascript,regex,Javascript,Regex,我喜欢\b单词边界分隔符,但在我看来,-不是单词分隔符。它应该是这个词的一部分 # in node > 'peter bengtsson o-peter'.replace(/\b(pete|be)/gi, 'X') 'Xr Xngtsson o-Xr' 我希望输出为Xr Xngtsson o-peter 我怎样才能做一些几乎像这样的事情,但使-成为单词的一部分而不是一个边界?使用Capture Group DIY边界 使用捕获组定义自定义分隔符。在本例中,分隔符是字符串^的开头或空格字符
\b
单词边界分隔符,但在我看来,-
不是单词分隔符。它应该是这个词的一部分
# in node
> 'peter bengtsson o-peter'.replace(/\b(pete|be)/gi, 'X')
'Xr Xngtsson o-Xr'
我希望输出为Xr Xngtsson o-peter
我怎样才能做一些几乎像这样的事情,但使-
成为单词的一部分而不是一个边界?使用Capture Group DIY边界
使用捕获组定义自定义分隔符。在本例中,分隔符是字符串^
的开头或空格字符
replaced = yourString.replace(/(^| )(?:pete|be)/gi, "$1X");
在替换中,$1
插入第1组括号捕获的内容,即如果匹配字符串开头,则插入空字符串,或者插入空格字符
输出:
Xr Xngtsson o-peter
选项2
正如@jongware所建议的,我的正则表达式可以调整为:
(^|[^-\w])(?:pete|be)
在替换的右侧,我们没有像原来那样匹配空格字符,而是匹配一个不是连字符或单词字符的字符,这更接近于在各种情况下“扩展\b
边界”的意图。您仍然需要在替换中使用组1:
replaced = yourString.replace(/(^|[^-\w])(?:pete|be)/gi, "$1X");
您始终可以使用解决方案:
var r = 'peter bengtsson o-peter'.replace(/(-)?\b(?:pete|be)/gi, function($0, $1) {
return $1 ? $0 : 'X';
});
console.log(r) //=> "Xr Xngtsson o-peter"
如果JS中只有负面的lookbehind可用,这将是微不足道的
您可以替换空间内的空间,也可以从[^-\w]
开始,因此它也适用于peter(“pete”)Peterson
。(未询问,但如果我没有弄错的话,这将与原始的\b
行为相同。)@Jongware你是对的,这是一个不错的选择。如果你把它贴上去,我会投上一票。不,把它加到你的上面。您的表达式适用于OP,这只是一个小小的改进。@Jongware将其添加为选项2,这要归功于您。感谢您的建议,它丰富了答案。+1用于添加两个选项。希望对OP有帮助