既然回答了这个问题,我就把最简单的答案放在这里。(感谢贝尔吉)
首先确保所有特殊字符都在“useWord”中转义
useWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");
然后像这样替换:
strIn.replace(new RexExp("\b"+userWord+"\b", "igm",replaceWord);
最初的问题已得到回答,但由于我有时还需要用单词替换符号(如 $ 与 HKD),因此上述答案不起作用:
/\$/.test("10 $ ") = true
/\b\$\b/.test("10 $ ") = false
更改了我的代码,因为那里有一个简单的错误:
([^A-Z]||^)
应该
([^A-Z]|^)
这里对代码进行详细说明:
用户可以指定一个词(=userWord 变量)和替换它的词(=replaceWord 变量)
例如:
usWord="博士";replaceWord="博士"
将单词 dr 替换为 Dr。
它需要不区分大小写,因此 DR,dR,Dr 和 dr 将替换为 Dr。问题是用户不了解正则表达式,因此需要转义“userWord”变量:(谢谢 Bergi)
userWord = userWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");
现在我告诉 JavaScript 什么是“单词”,所以“驱动器”不会被替换,看起来像“Dr.ive”(编辑:原始代码是错误的,有 || 而不是 | 现在它已修复)
([^AZ]|^) 表示单词之前没有字母字符或单词位于行首。(“dream”和“drive”现在匹配,但不匹配“bandr”)
([^AZ]|$) 表示单词后没有字母字符或单词在行尾。(“梦想”和“驾驶”现在不再匹配了)
r=new RexExp("([^A-Z]|^)("+userWord+")([^A-Z]|$)","igm");
假设变量 strIn 是包含需要替换的单词的文本,那么现在我们可以开始替换:
strIn=strIn.replace(r,replaceWord);
如果 strIn = "Julia 和 Ben 博士。" userWord="dr" 和 replaceWord="Dr." 那么输出是:
“朱莉娅和博士本。”
哎呀,我仍然不知道最简单的方法是不替换第一个和最后一个组(我保证明天会阅读正则表达式教程)。到目前为止我想出的解决方案是:
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;