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



我在构造一个正则表达式时遇到问题,该正则表达式将允许除 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

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

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

使用负面前瞻:

(?!_blacklist_)_whitelist_

在这种情况下:

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

划线为 \u005F,百分比为 \u0025。您可以简单地更改范围以排除这两个字符:

^[u0000-u0024u0026-u005Eu0060-uFFFF]

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


但我不认为你会以这种方式得到你真正想要的结果。JS只能达到uFFFF,任何超过的技术上都是两个字符。

根据这里,以下代码返回 false:

/^.$/.test('💩')

您需要使用不同的方法来查看是否有超出该范围的字符。此答案给出以下代码:

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

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

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

最新更新