我在构建正则表达式时遇到问题,该正则表达式允许使用除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
答案 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])*$