0

既然回答了这个问题,我就把最简单的答案放在这里。(感谢贝尔吉)

首先确保所有特殊字符都在“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;
4

1 回答 1

3

尝试使用单词边界锚

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

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

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

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

于 2012-09-30T09:30:31.137 回答