在javascript正则表达式中组合白名单和黑名单

时间:2016-05-09 15:05:54

标签: javascript regex

我在构建正则表达式时遇到问题,该正则表达式允许使用除2个字符外的所有UTF-8字符:_?

因此白名单为:^[\u0000-\uFFFF],黑名单为:^[^_%]

我需要将这些组合成一个表达式。

我尝试了以下代码,但是没有按照我希望的方式运行:

var input = "this%";
var patrn = /[^\u0000-\uFFFF&&[^_%]]/g;
if (input.match(patrn) == "" || input.match(patrn) == null) {
    return true;
} else {
    return false;
}

输入:此%

实际输出:true

所需的输出:false

3 个答案:

答案 0 :(得分:1)

如果我理解正确,其中一个就足够了:

/^[^_%]*$/.test(str);
!/[_%]/.test(str);

答案 1 :(得分:1)

下划线是\ u005F,百分比是\ u0025。您只需更改范围即可排除这两个字符:

^[\u0000-\u0024\u0026-\u005E\u0060-\uFFFF]

这将与原始正则表达式一样快。

但我认为你不会得到真正想要这样的结果。 JS只能达到\uFFFF,从技术上来说,这将是两个字符。

根据here,以下代码返回false:

/^.$/.test('')

您需要采用不同的方式来查看是否有超出该范围的字符。 This answer提供以下代码:

String.prototype.getCodePointLength= function() {
    return this.length-this.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g).length+1;
};

简单地说,如果返回的数字与.length()返回的数字不同,那么你有一个代理对(因此你应该返回false)。

如果您的输入通过了该测试,则可以针对另一个正则表达式运行它,以避免您想要避免的\u0000-\uFFFF之间的所有字符。

答案 2 :(得分:0)

使用否定前瞻:

(?!_blacklist_)_whitelist_

在这种情况下:

^(?:(?![_%])[\u0000-\uFFFF])*$