如何用标签包装一组单词,JavaScript替换正则表达式

时间:2009-11-29 04:01:31

标签: javascript regex replace

我试图用HTML标签包装一些单词,因为我正在使用正则表达式。我快到了:

这是我的正则表达式

/((apple|banana|cherry|orange)\b\s?)+/gi

这是我的替代品:

<em>$&</em>

完全适用于我的示例文本:

Apple Banana apple cherry, Cherry orange and Oranges Apple, Banana

结果是:

<em>Apple Banana apple cherry</em>, <em>Cherry orange </em>and Oranges <em>Apple</em>, <em>Banana</em>

我可以务实并与之共存,但我会非常希望在最后一场比赛之后让比赛更加完美。

即。我的完美结果是(看到“樱桃橙”之后左移的标签):

<em>Apple Banana apple cherry</em>, <em>Cherry orange</em> and Oranges <em>Apple</em>, <em>Banana</em>

3 个答案:

答案 0 :(得分:4)

JavaScript不支持lookbehind。这是一种耻辱,正如我们本可以做到的那样:

// doesn't work in JavaScript:
/((apple|banana|cherry|orange)\b\s?)+(?<!\s)/gi 

然而,我们可以做的是将白色空间移动到开头,并添加一个负向前瞻(因此捕获不能以空格开头):

/(?!\s)(\s?\b(apple|banana|cherry|orange)\b)+/gi

与您的代码略有不同的是,我还在模式的开头添加了\b,因此它无法从apple抓取Snapple

答案 1 :(得分:2)

您可以将函数放在replace参数中

function(x){return "<em>"+x.replace(/\s+$/,"")+"<em>";}代替<em>$&</em>

你可以在该函数中添加条带空间。

"Apple Banana apple cherry, Cherry orange and Oranges Apple, Banana".replace(
/((?:apple|banana|cherry|orange)\b\s?)+/gi,
function(x){
   return "<em>"+x.replace(/\s+$/,"")+"<em>";
})

<em>Apple Banana apple cherry<em>, <em>Cherry orange<em>and Oranges <em>Apple<em>, <em>Banana<em>

答案 2 :(得分:0)

您也可以通过模式末尾的前瞻来解决这个问题,以确保任何匹配后跟空格,逗号或字符串结尾(这自然意味着如果结果是匹配则匹配不匹配接下来是一封信,在有问题的例子中就是这种情况。)

改变匹配模式:

/((apple|banana|cherry|orange)\b\s?)+(?=\s|,|$)/gi