Javascript正则表达式替换word,但不在花括号内

Javascript正则表达式替换word,但不在花括号内,javascript,regex,Javascript,Regex,我有一些内容,例如: 如果您有问题,请向StackOverflow寻求帮助 我有一个同义词列表: a={one typical|only one|one single|one sole|merely one|just one|one unitary|one small|this solitary|this slight} ask={question|inquire of|seek information from|put a question to|demand|request|expect|i

我有一些内容,例如:

如果您有问题,请向StackOverflow寻求帮助

我有一个同义词列表:

a={one typical|only one|one single|one sole|merely one|just one|one unitary|one small|this solitary|this slight}
ask={question|inquire of|seek information from|put a question to|demand|request|expect|inquire|query|interrogate}
我正在使用JavaScript来:

  • 基于
    =
  • 循环遍历每个同义词,如果在内容中找到,则替换为
    {…|…}
  • 输出应该如下所示:

    如果你有{一个典型的|只有一个|只有一个|只有一个|只有一个|只有一个|一个单一的|一个小的|问题{问题|询问|从|寻求信息|提出问题|要求|请求|期望|询问|询问|询问|询问

    问题:
    它不是替换整个单词,而是替换找到的每个字符。我的代码:

    for(syn in allSyn) {
        var rtnSyn = allSyn[syn].split("=");
        var word = rtnSyn[0];
        var synonym = (rtnSyn[1]).trim();
        if(word && synonym){
            var match = new RegExp(word, "ig"); 
            postProcessContent = preProcessContent.replace(match, synonym);
            preProcessContent = postProcessContent;
        }
    }
    

    它应该用同义词替换内容词,同义词不应该出现在
    {…|…}

    正则表达式包括一个称为“单词边界”的东西,由
    \b
    表示。这是一个零宽度断言(它只是检查一些东西,而不是“吃”输入),它说为了匹配,必须应用某些单词边界条件。一个例子是后跟字母的空格;给定字符串
    'X'
    ,此正则表达式将与之匹配:
    /\bX/
    。因此,要使代码正常工作,只需在单词regex的开头和结尾添加单词边界,如下所示:

    for(syn in allSyn) {
        var rtnSyn = allSyn[syn].split("=");
        var word = rtnSyn[0];
        var synonym = (rtnSyn[1]).trim();
        if(word && synonym){
            var match = new RegExp("\\b"+word+"\\b", "ig"); 
            postProcessContent = preProcessContent.replace(match, synonym);
            preProcessContent = postProcessContent;
        }
    }
    

    [请注意,每个单词边界匹配器中都有两个反斜杠,因为在javascript字符串中,反斜杠用于转义字符——两个反斜杠会变成一个文字反斜杠。]

    正则表达式包括一个称为“单词边界”的东西,由
    \b
    表示。这是一个零宽度断言(它只是检查一些东西,而不是“吃”输入),它说为了匹配,必须应用某些单词边界条件。一个例子是后跟字母的空格;给定字符串
    'X'
    ,此正则表达式将与之匹配:
    /\bX/
    。因此,要使代码正常工作,只需在单词regex的开头和结尾添加单词边界,如下所示:

    for(syn in allSyn) {
        var rtnSyn = allSyn[syn].split("=");
        var word = rtnSyn[0];
        var synonym = (rtnSyn[1]).trim();
        if(word && synonym){
            var match = new RegExp("\\b"+word+"\\b", "ig"); 
            postProcessContent = preProcessContent.replace(match, synonym);
            preProcessContent = postProcessContent;
        }
    }
    

    [请注意,每个单词边界匹配器中都有两个反斜杠,因为在javascript字符串中,反斜杠用于转义字符——两个反斜杠会变成文字反斜杠。]

    构建regexp时,需要在开头和结尾都包含反斜杠,以匹配整个单词(仅以
    [a-zA-Z0-9.
    中的字符开头和结尾):

    根据您正在进行的特定替换,您可能希望将您的方法应用于使用诸如
    /\w+/g
    之类的regexp匹配的单个单词(而不是一次应用于整个文本),以避免替换本身就是其他单词的单词。例如:

    content = content.replace(/\w+/g, function(word) {
        for(var i = 0, L = allSyn.length; i < L; ++i) {
            var rtnSyn = allSyn[syn].split("=");
            var synonym = (rtnSyn[1]).trim();
            if(synonym && rtnSyn[0].toLowerCase() == word.toLowerCase()) return synonym;
        }
    });
    
    content=content.replace(/\w+/g,函数(word){
    对于(变量i=0,L=allSyn.length;i
    当您构建regexp时,您需要在开头和结尾都包含以匹配整个单词(以
    [a-zA-Z0-9]中的字符开头和结尾)

    根据您正在进行的特定替换,您可能希望将您的方法应用于使用诸如
    /\w+/g
    之类的regexp匹配的单个单词(而不是一次应用于整个文本),以避免替换本身就是其他单词的单词。例如:

    content = content.replace(/\w+/g, function(word) {
        for(var i = 0, L = allSyn.length; i < L; ++i) {
            var rtnSyn = allSyn[syn].split("=");
            var synonym = (rtnSyn[1]).trim();
            if(synonym && rtnSyn[0].toLowerCase() == word.toLowerCase()) return synonym;
        }
    });
    
    content=content.replace(/\w+/g,函数(word){
    对于(变量i=0,L=allSyn.length;i
    为了优化,不要在每次迭代中创建一个新的RegExp。相反,构建一个大的regex,比如
    [^{a-Za-z](a | ask |…)[^}a-Za-z]
    和一个散列,每个键都有一个值,指定替换它的内容。我对JavaScript不够熟悉,无法动态创建代码


    注意分隔符regex,它表示匹配不能以
    {
    开头或以
    }
    结尾。这不是非常精确,但希望在实践中可以接受。如果您确实需要替换
    {
    }旁边的单词
    那么这当然可以改进,但我希望我们不必这样做。

    为了优化,不要在每次迭代中创建一个新的正则表达式。相反,构建一个大的正则表达式,如
    [^{a-Za-z](a | ask |…)[^}a-Za-z]
    和一个散列,每个键都有一个值,指定替换它的内容。我对JavaScript不够熟悉,无法动态创建代码


    注意分隔符regex,它表示匹配不能以
    {
    开头或以
    }
    结尾。这不是非常精确,但希望在实践中可以接受。如果您确实需要替换
    {
    }旁边的单词
    那么这当然可以改进,但我希望我们不必这样做。

    我不想替换已经同义化但不在{…|…}中的项目。我不想替换已经同义化但不在{…|…}中的项目。我不想替换已经同义化但不在{…|…}中的项目。我不想替换已经同义化但不在{…|…}中的项目你收到了两个答案,你对这两个答案都给出了相同的否定回答。你不认为这可能意味着你需要重新表述你的问题吗?请澄清你想要完成什么。特别是,你如何定义
    allSyn
    ?嗨,我不是有意给出否定回答。我只是这个论坛的新手。她的我正在做的事情1:阅读我们的文件ing ajax.word={synonym | synonym}2:var allSyn=(http.responseText.replace(/\s+$/g,“)).split(“\n”);3:从div 4获取预处理内容:在allSyn中循环,在预处理内容中找到该词并替换相同的词(