2016-11-23 53 views
1

我有以下字符串匹配一个词,除非它前面有一个等号?

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

,当使用us我想变成

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

我试着寻找有关的答案,但我不能完全得到它的工作方式搜索我想要它。我特别感兴趣的是this answer的回调方法。

帮助表示赞赏

+2

停止试图用正则表达式来解析HTML! – Jamiec

+0

为了扩展我以前的评论,当有人来使用'class =“的(正确)格式时,使用”>“使用'您的正则表达式将失败,并且现在要处理更多的复杂问题,单引号,双引号,带空格的双引号等等等 – Jamiec

回答

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正则表达式,你也会尝试实现这一点很糟糕)。

0

我会先查找除等号[^=]以外的任何字符,然后用括号,以便我可以在我的替代品中再次使用它。然后另一组的两个字符加上括号的us应该这样做:

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

这会给你两个捕获组,(内括号),工作,你可以在你的替换字符串$1$2代表。

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

尝试'str =“使用”',你的正则表达式将失败;) –

+0

对。接得好。 – nwalton

2

如果你可以让你的文档结构的任何假设,您可以使用在DOM元素进行操作,而不是直接用正则表达式解析整个文档的方法会更好

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

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

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

相关问题