我发现用php下面的正则表达式强调单词的单词
/(?<!\\w)".$word."(?!\\w)/
我希望使用正则表达式在javascript中使用此正则表达式的精确输出。
有人可以推荐以上正则表达式的javascript正则表达式吗?
我想搜索起始索引 - 从实现的JS正则表达式匹配的单词的结束索引。
答案 0 :(得分:3)
您可以使用\b
(字边界)令牌like this来匹配字词。
var text = 'I want to match .word. all words that have .word. in them.';
var word = '.word.';
var regex = new RegExp('(' + escapeRegExp(word) + ')');
console.log(text.match(regex));
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
&#13;
编辑:由于评论而更新。
答案 1 :(得分:0)
一个重要的注意事项:在PHP中,如果使用\w
修饰符,/u
可能会识别Unicode,但由于您没有使用该Unicode模式,因此以下内容应该以相同的方式工作。
JS正则表达式不支持 lookbehinds 。您需要将lookbehind转换为包含两个备选方案的捕获组:字符串的开头或非单词字符。
所以,你的构造函数看起来像
new RegExp('(^|\\W)(' + search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')(?!\\w)', 'g')
这是一个正则表达式演示:
var search = '.search.';
var rx = new RegExp('(^|\\W)(' + search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')(?!\\w)', 'g');
var s = ".search. .search.";
while ((m=rx.exec(s))!==null) {
if (m[1]) {
console.log(m.index+1, rx.lastIndex);
} else {
console.log(m.index, rx.lastIndex);
}
}
&#13;
span.highlight {
color: #FF0000;
}
&#13;
(^|\\W)
将匹配并捕获字符串的开头或非字char到组1(从替换模式引用$1
反向引用)并且搜索字以{{1进行转义(以防万一有.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
,.
之类的特殊字符等。搜索词被捕获到第2组中。
前瞻性的支持方式与PHP相同,因此您可以像原始正则表达式一样使用(
。
(?!\\w)
将获取匹配开始位置,因此,我们需要检查组1是否为空。如果不是,它匹配非单词符号,所以我们需要在使用之前增加它。否则,只需使用普通m.index
。结束位置是m.index
属性值。