在JS RegExp中转义特殊字符(在jQuery .each()中使用)

时间:2018-07-02 06:00:40

标签: javascript jquery regex each

首先,如果标题的结构不好,我必须道歉。我正在努力尝试将所有有效点合并为足够简短的标题。如果您能想到更好的选择,请随时进行编辑。

问题

我已经创建了一个JavaScript / jQuery替代品,来代替受支持不佳的{5} HTML5元素,并且在很大程度上,我对它的结果感到满意。

所有方法都有效,但是特殊的<datalist>字符存在一个问题,就是我不太确定如何转义它们,以免控制台中出现错误。

我要转义的字符特别是RegExp()。我知道在JavaScript正则表达式中,您应该使用反斜杠来转义这些字符,但是到目前为止,在我尝试过的所有尝试中,代码都完全无法正常工作,以至于我没有做正确的事。

我只是想知道如何在当前代码中实现转义?您可以从注释行中看到我尝试过的其他方法。

错误

输入有效并正确显示游戏。但是,如果您从jsFiddle中选择/选项之一,然后转到括号中的Backspace,则控制台将引发以下错误:

  

未捕获到的SyntaxError:无效的正则表达式:/ Grand Theft Auto V(PC /:未终止的组

代码

实时预览:jsFiddle

JavaScript / jQuery:

Grand Theft Auto V

HTML:

$('#game-name').keyup( function() {
    var input     = $('#game-search');
    var offset    = input.offset();
    var game_name = $("#game-search").val();

    // List
    function show() {
        $('#game-list').css({
            'display': 'inline-block',
            'left': offset.left,
            'min-width': input.outerWidth(),
            'top': offset.top + input.outerHeight()
        });
    }
    function hide() {
        $('#game-list').css({
            'display': 'none',
            'left': offset.left,
            'min-width': input.outerWidth(),
            'top': offset.top + input.outerHeight()
        });
    }
    if (game_name.length >= 1) {
        show();
    }
    else {
        hide();
    }

    // Filter
    var regexp = new RegExp( game_name, "i" );
    //var regexp = new RegExp(/[A-Za-z0-9_()\/]/, "i");
    // [A-Za-z0-9_()\/]
    $("#game-list ul").children("li").each(function(index) {
        if (game_name.length < 1) {
            $(this).addClass('reset').removeClass('match no-match');
        }
        else {
            //if (/[A-Za-z0-9_()\/]/i.test( $(this).html() )) {
            if (regexp.test( $(this).html() )) {
                $(this).addClass('match').removeClass('no-match reset');
            } else {
                $(this).addClass('no-match').removeClass('match reset');
            }
        }
    });

    // Apply
    $('#game-list ul li').click( function() {
        $('#game-search').val( $(this).attr('value') );
        $('#game-list').css('display', 'none');
    });
});

谢谢。

1 个答案:

答案 0 :(得分:1)

您是正确的,您需要转义正则表达式的字符。

尝试使用两个反斜杠来使正则表达式中的game_name逸出:

var regexp = new RegExp(game_name.replace(/\(|\)/g, "\\$&"), "i");

之所以需要额外的反斜杠,是因为反斜杠在字符串文字和正则表达式中都具有特殊含义。第一个是转义字符,只有第二个被采用。