JavaScript正则表达式替换'+ ve'而'正'不起作用

Joh*_*eld 1 javascript regex

我有一个看似非常简单的任务 - 在字符串中查找所有出现的'+ ve'并替换为'positive'.

我知道我需要逃避加号,因此我使用'\\ +'.

如果我不与单词边界结合,它工作正常:

var txt = 'I am most +ve this should work!';
var pattern = new RegExp('\\+ve', 'gi');
alert(txt.replace(pattern, 'positive'));
Run Code Online (Sandbox Code Playgroud)

但是,只要我与单词边界结合,正则表达式就无法匹配:

var txt = 'I am most +ve this should work!';
var pattern = new RegExp('\\b\\+ve\\b', 'gi');
alert(txt.replace(pattern, 'positive'));
Run Code Online (Sandbox Code Playgroud)

我确信有一个明显的解决方案 - 任何建议都是最受欢迎的!

Mat*_*and 5

你的问题是\ b之间会匹配+v因为+不是单词字符.

可能最简单的解决方法是匹配周围的空白+ve:

var txt = 'I am most +ve this should work!';
var pattern = /(^|\s)\+ve(\s|$)/gi;
console.log(txt.replace(pattern, ' positive '));
Run Code Online (Sandbox Code Playgroud)

\b相当于(^\w|\w$|\W\w|\w\W)你打破它的匹配:

^\w 字符串开头的单词字符

\w$ 字符串末尾的单词字符

\W\w 非单词字符后跟单词字符

\w\W 单词字符后跟非单词字符

"单词字符"等同于:[a-zA-Z0-9_]您将注意到,它不包括在内+.所以+v是一个非单词字符,后跟一个单词字符.换句话说,它匹配\W\w.

从技术上讲,周围的空间+ve可能不是一个空格(例如它可能是一个标签),所以为了保持正确的间距,你可以做一些事情(这是javascripts缺乏lookbehinds真的很烦人):

var pattern = /(\s)\+ve(\s)/gi;
console.log(txt.replace(pattern, '$1postive$2'));
Run Code Online (Sandbox Code Playgroud)