匹配一个单词,除非它前面有一个等号?

时间:2016-11-23 15:12:41

标签: javascript regex

我有以下字符串

class=use><em>use</em>

使用us搜索时我想转换为

class=use><em><b>us</b>e</em>

我已经尝试过查找相关答案但我无法按照我想要的方式工作。我对this answer的回调方法特别感兴趣。

帮助表示赞赏

3 个答案:

答案 0 :(得分:3)

这是编写正则表达式的一个很好的练习,这是一个可能的解决方案。

"useclass=use><em>use</em>".replace(/([^=]|^)(us)/g, "$1<b>$2</b>");

// returns "<b>us</b>eclass=use><em><b>us</b>e</em>"

([^=]|^)确保任何匹配的us的前缀不是等号,或者是字符串的开头。

正如@jamiec在评论中指出的那样,如果您使用它来解析/修改HTML,请立即停止。从数学上讲,用常规语法解析CFG是不可能的(即使使用增强的JS regexp,你也会花费很少的时间来实现它。)

答案 1 :(得分:2)

如果您可以对文档的结构做出任何假设,那么使用直接操作DOM元素的方法而不是使用正则表达式解析整个文档可能会更好。

使用正则表达式解析HTML有一些问题可能会很难处理。

var element = document.querySelector('em');

element.innerHTML = element.innerHTML.replace('us', '<b>us</b>');
<div class=use><em>use</em>
</div>

答案 2 :(得分:0)

我首先会查找除等号[^=]以外的任何字符,并将其与括号分开,以便我可以在替换时再次使用它。然后围绕两个字符us的另一组括号应该这样做:

var re = /([^=]|^)(us)/

这将为您提供两个捕获组(在括号内),您可以在替换字符串中使用$1$2表示。

str.replace( /([^=|^])(us)/, '$1<b>$2</b>' );