由于这是回答,我在这里提出最简单的答案。 (感谢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;
答案 0 :(得分:3)
var r = new RegExp("\b"+userWord+"\b", "ig");
return strIn.replace(r, replaceWord);
此外,您的正则表达式转义并不完整。使用
userWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");
(管道之后的最后几个,或多或少是可选的,具体取决于你在正则表达式中使用转义字符串的位置)。