JavaScript中的Word边界正则表达式

时间:2017-06-23 09:23:50

标签: javascript regex

假设我有以下字符串:

bla bla "some" bla bla some bla bla something

我想更换一些'某些'带有''的有界非单词符号。我为此目的写了一个正则表达式:

/^|[^0-9a-zа-я](some)[^0-9a-zа-я]|$/gi

我如何使用它:

'bla bla "some" bla bla some bla bla something'.replace(/^|[^0-9a-zа-я](some)[^0-9a-zа-я]|$/gi, '<$1>')

结果是

<>bla bla <some> bla bla<some>bla bla something<>

但我期待

bla bla "<some>" bla bla <some> bla bla something

我怎么能修复这个正则表达式?据我所知,JavaScript的正则表达式不支持命名组。

注意:我无法使用\b,因为我想要匹配的单词包含西里尔符号,而Javascript的正则表达式引擎中的\b与非拉丁字母无法正常工作。

2 个答案:

答案 0 :(得分:1)

你可以沿着这些方向使用:

yourString.replace(/(^|[^0-9a-zа-я])(some)(?![0-9a-zа-я])/gi, '$1<$2>')

Try it online.

请注意,当Wiktor Stribiżew对另一个答案发表评论时,您的角色类只会匹配basic Cyrillic alphabet并会遗漏其他西里尔字符。另一种方法是停止使用否定字符类,如果它们更容易枚举,则匹配您期望作为单词分隔符的字符。在那种视觉上["\s]似乎是一个好的开始:

yourString.replace(/(^|[\s"])(some)(?![^\s"])/gi, '$1<$2>')

Try it online.

答案 1 :(得分:1)

分组并捕获开始和结束的替代方案,并将这些捕获包括在替换字符串中:

var regex = /(^|[^0-9a-zа-яё])(some)([^0-9a-zа-яё]|$)/gi;
var output = 'bla bla "some" bla bla some bla bla something'.replace(regex, '$1<$2>$3');
console.log(output);