我在构造一个正则表达式时遇到问题,该正则表达式将允许除 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
之间的所有字符。