为什么我的正则表达式不匹配整个文档?

时间:2013-04-19 23:57:28

标签: javascript jquery regex

我正在尝试构建一个小型Javascript应用程序,该应用程序加载第三方站点,查找给定单词并使用Jquery扩展Highlight突出显示文档的最接近上下文(使用小型自定义来允许正则表达式)。

首先,我试图让应用程序通过将上下文设置为500个字符来突出显示周围环境,但由于某种原因,它会在奇怪的地方切断。对于this article,我正在尝试匹配 Obama 一词,正如您从屏幕截图中看到的那样,它会在不应该出现的位置切断。

有没有人知道发生了什么?

$(document).ready(function() {
    $.get(getUrlVars()["url"],
    function(data) {
        var fdata = $(data);
        var associationScope= 500;


        $.each(getUrlVars()["topics"].split(","), function(index, value) {
            if (getUrlVars()["associationScope"] == "context") {
                var associationScopeRegex = "((?!</span>)[\\s\\S]{0," + associationScope + "})" 
                    + value + "((?!<span class=\"associationScope\">)[\\s\\S]{0," + associationScope + "})";

                fdata.highlight(associationScopeRegex, {className: "associationScope"});
            }

            fdata.highlight(value, {className: "topicHighlight"});
        });

        $("#externalPage").html(fdata);

    });
});

Screenshot of the highlighting result

1 个答案:

答案 0 :(得分:2)

当你通过字符串构建时,你需要转义一些正则表达式元字符(在你的情况下是反斜杠):

   var associationScopeRegex = "((?!</span>)(.|\\n|\\r|\\t){0," + associationScope + "})" 
       + value + "((?!<span class=\"associationScope\">)(.|\\n|\\r|\\t){0," + associationScope + "})";

当您从字符串构建正则表达式时,您必须考虑到JavaScript解析器不知道您的字符串将成为正则表达式的事实;它只是将其解析为字符串。字符串常量的语法对某些特殊字符使用反斜杠,因此这些字符将被解释为字符串的一部分。

(你不必为双引号字符的反斜杠加倍,因为将它们留作正则表达式的简单双引号是可以的。)