Javascript 匹配可能具有特殊字符的单词

Javascript 匹配可能具有特殊字符的单词,javascript,regex,Javascript,Regex,我试图替换字符串中给定单词的所有匹配项,但该单词可能包含需要转义的特殊字符。下面是一个例子: ERA是投手每9次放弃的赢得的平均分 投了几局。同时,时代+,调整后的时代,是投手的时代 根据投手的棒球场赢得的平均跑数(ERA)(以防 棒球场偏爱击球手或投手)和投手的时代 联盟 我希望能够做到以下几点: string = "The ERA..." // from above string = string.replaceAll("ERA", "<b>ERA</b>"); st

我试图替换字符串中给定单词的所有匹配项,但该单词可能包含需要转义的特殊字符。下面是一个例子:

ERA是投手每9次放弃的赢得的平均分 投了几局。同时,时代+,调整后的时代,是投手的时代 根据投手的棒球场赢得的平均跑数(ERA)(以防 棒球场偏爱击球手或投手)和投手的时代 联盟

我希望能够做到以下几点:

string = "The ERA..." // from above
string = string.replaceAll("ERA", "<b>ERA</b>");
string = string.replaceAll("ERA+", "<u>ERA+</u>");
另外(尽管这很明显)
“thetext”
是一个包含一些文本的虚拟div。从


谢谢

要使用具有负前瞻性的正则表达式:

string.replace(/\bERA(?!\+)\b/g, "<b>ERA</b>");
string.replace(/\bERA(?!\+)\b/g,“ERA”);

string.replace(/\bERA\++/g,“ERA+”);
添加了零宽度字边界
\b
,以便更好地测量,因此不会意外地匹配“BERA”等字符串


另一个想法是按最长键到最小键对首字母缩略词列表进行排序。通过这种方式,您一定要在“ERA”之前替换所有的“ERA+”,这样就不会有子字符串冲突。

好的,在查看您的JSFIDLE之后,这需要做很多工作

我认为最好的方法是搜索以大写字母开头的完整单词,这些单词可能包含
/
%
。类似这样的内容:
([A-Z][\w/%]+)

警告:无论您如何操作,如果您在浏览器中进行操作(例如,您无法更新原始数据),这将是一个过程密集型操作

您可以这样实现它:

var repl = str.replace(/([A-Z][\w\/%]+)/g, function(match) {
    //alert(match);
    if (match in acronyms)
        return "<abbr title='" + acronyms[match] + "'>" + match + "</abbr>";
    else
        return match;
});
var repl=str.replace(/([A-Z][\w\/%]+)/g,函数(匹配){
//警报(匹配);
if(首字母缩略词匹配)
返回“


请注意,jQuery不是必需的,只是在本例中使用它以便于在JSFIDLE中更新DOM。

您使用什么标准来确定您正在搜索什么?ERA是一个例子,您可以提供一些其他的(除了K/9、IP/GS等)吗?@r3mus它大部分是1、2或3个字母,总是大写(A、K、AB),可能还有一个“/”(如IP/GS)或尾随“+”或“%”(如ERA+或SB%)。如果您想快速查看,我已在上上载了整个首字母缩略词数组。感谢您的回答!两个问题:#1,它似乎不适用于第二种情况(ERA+),
“ERA是一种东西,ERA+也是一种东西”。替换(/\bERA+/g,“是”);
显示为”YES是某种东西,YES+”。第一个非常有效!#2.我不确定如何从数组中构建这些表达式:
string.replace('\b'+arr[I]+'/g',YES')
似乎不起作用。我还需要事先检查要替换的令牌是否包含a+或a/吗?非常感谢!@Alex Oops,忘记了
+
是一个需要转义的特殊字符。修复了。在看到您的回复之前编辑了我的评论,修复了#1。谢谢!效果很好!它似乎没有拾取一个字母s或表单0A的条目(如1B等)。我会尝试修复它,谢谢!它在开始时强制搜索大写字母a-Z;如果您也需要捕获数字,请将
[a-Z]
替换为
[a-Z0-9]
string.replace(/\bERA(?!\+)\b/g, "<b>ERA</b>");
string.replace(/\bERA\+/g, "<u>ERA+</u>");
var repl = str.replace(/([A-Z][\w\/%]+)/g, function(match) {
    //alert(match);
    if (match in acronyms)
        return "<abbr title='" + acronyms[match] + "'>" + match + "</abbr>";
    else
        return match;
});