替换为使用动态模式替换除动态字符串中给出的字符之外的所有字符

时间:2017-08-31 07:15:29

标签: jquery regex replace

我有一个自定义正则表达式,在进行测试时工作正常,如果字符串与模式匹配,当我尝试同样替换与模式不匹配的字符时,它似乎不起作用。请帮助我理解,我在做什么错误:

这是我的测试代码,运行正常:

function alphaNumCheckOnKeyPress(event, elementId, customPattern) {

    var asciiCode = event.which ? event.which : event.charCode;
    customPattern = (customPattern == undefined ? $('#'+elementId).attr('data-custom') : customPattern );
    var str = String.fromCharCode(asciiCode);
    var strToVal = new RegExp('^[a-zA-Z0-9' + customPattern + ']+$');

    if ( strToVal.test(str) )
        alert("test passed")
    else
        alert("test failed");

}

但是当我尝试使用相同的模式替换字符时,它不起作用:

$(document).on('paste blur', '.alphaNum', function(){
    var that = this;
    setTimeout(function() {
        var customPattern = $(that).attr('data-custom') || "";
        $(that).val($(that).val().replace(new RegExp('^[A-Za-z0-9' + customPattern + ']+$', 'g'), ''));
    }, 0);
});

例如,我在自定义模式中传递下划线(_),这是允许的,不应该从替换中跳过。

1 个答案:

答案 0 :(得分:1)

'^[a-zA-Z0-9_]+$'模式匹配整个字符串,该字符串仅包含单词字符(字母,数字,_)。您似乎想要删除除了在正则表达式字符类中指定的字符之外的所有字符。

因此,你需要使它成为一个否定的字符类并删除锚点^(字符串的开头)和$(字符串的结尾)。

此外,如果内部有customPattern]^\,则-需要进行一些转义以避免出现问题只有在JavaScript字符类中可能具有特殊含义且被视为文字字符的字符必须被转义。

.replace(new RegExp('[^A-Za-z0-9' + customPattern.replace(/[\]^\\-]/g, '\\$&') + ']+', 'g'), '')