假设我有以下字符串:
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
与非拉丁字母无法正常工作。
答案 0 :(得分:1)
你可以沿着这些方向使用:
yourString.replace(/(^|[^0-9a-zа-я])(some)(?![0-9a-zа-я])/gi, '$1<$2>')
请注意,当Wiktor Stribiżew对另一个答案发表评论时,您的角色类只会匹配basic Cyrillic alphabet并会遗漏其他西里尔字符。另一种方法是停止使用否定字符类,如果它们更容易枚举,则匹配您期望作为单词分隔符的字符。在那种视觉上["\s]
似乎是一个好的开始:
yourString.replace(/(^|[\s"])(some)(?![^\s"])/gi, '$1<$2>')
答案 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);