我有一个看似非常简单的任务 - 在字符串中查找所有出现的'+ 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)
我确信有一个明显的解决方案 - 任何建议都是最受欢迎的!
你的问题是\ 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)
| 归档时间: |
|
| 查看次数: |
38 次 |
| 最近记录: |