JavaScript用其他单词替换文本中的任何单词

时间:2012-09-30 08:33:58

标签: javascript regex firefox

由于这是回答,我在这里提出最简单的答案。 (感谢Bergi)

首先确保所有特殊字符都在'useWord'

中转义
useWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");

然后像这样替换:

strIn.replace(new RexExp("\b"+userWord+"\b", "igm",replaceWord);

原来的问题已得到解答,但由于我有时也需要用文字替换标语(如$ with HKD),上述答案不起作用:

/\$/.test("10 $ ") = true
/\b\$\b/.test("10 $ ") = false

更改了我的代码,因为那里有一个简单的错误:

([^A-Z]||^)

应该是

([^A-Z]|^) 

这里有代码的详细说明:

用户可以指定一个单词(= userWord变量)和要替换它的单词(= replaceWord变量)

例如:

usWord = “DR”;替换字= “博士”

将博士替换为博士

它需要不区分大小写,因此DR,dR,博士和博士将被博士取代 问题是用户不知道正则表达式所以'userWord'变量需要被转义:(谢谢Bergi)

userWord = userWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");

现在我告诉JavaScript什么是“单词”,所以“驱动”不会被替换,看起来像“Dr.ive”(编辑:原始代码错了,有||而不是|现在它已修复)

([^ A-Z] | ^)表示在单词或单词位于行的开头之前没有字母字符。 (“梦想”和“驱动”现在匹配但不匹配“bandr”)

([^ A-Z] | $)表示单词或单词位于行尾后没有字母字符。 (“梦想”和“驱动”现在不再匹配了)

r=new RexExp("([^A-Z]|^)("+userWord+")([^A-Z]|$)","igm");

假设变量strIn是包含需要替换的单词的文本,现在我们可以开始替换:

strIn=strIn.replace(r,replaceWord);

如果strIn =“朱莉娅和本博士。” userWord =“dr”和replaceWord =“Dr。”然后输出是:

“Julia anddrBen。”

哎呀,我仍然不知道最简单的方法是不让第一个和最后一个组被替换(明天会阅读正则表达式教程,我保证)。我到目前为止提出的解决方案是:

strIn=strIn.replace(r,function(a,b,c,d){
    return b + replaceWord + d;
});

之前没用,因为我使用了||而不是|

在我的应用程序中,userWord和replaceWord不是一个单值而是一个数组,但在这种情况下并不重要。这是完整的代码(正常工作)感谢Jim O'Brien并使用$代表不同的组,代码可以简化:

userWord="dr";
replaceWord="Dr.";
strIn="Julie was driving dr David."
userWord = userWord.
    .replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");
r=new RexExp("([^A-Z]|^)("+userWord+")([^A-Z]|$)","igm");
strIn=strIn.replace(r, "$1" + replaceWord + "$2");
return strIn;

1 个答案:

答案 0 :(得分:3)

尝试使用word boundary anchors

var r = new RegExp("\b"+userWord+"\b", "ig");
return strIn.replace(r, replaceWord);

此外,您的正则表达式转义并不完整。使用

userWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");

(管道之后的最后几个,或多或少是可选的,具体取决于你在正则表达式中使用转义字符串的位置)。