NodeJS 正则表达式测试函数生成范围错误
我需要检查特定字符串是否是有效的 base64。在传递一个非常大的有效 base64 字符串后,测试函数遇到范围错误(超出最大调用堆栈大小)。
if (/^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/.test(base64)) {
// if valid base64 proceed, ...
}
我应该如何避免遇到这个错误?我应该将 base64 字符串分成更小的字符串并单独测试吗?
回答如下:有这些规则要检查:
- 最多允许两个
符号,并且它们应该在输入的最后=
- 所有其他字符应为字母数字或
或+
。/
- 总输入长度必须是4的倍数
为避免大量回溯,您可以通过在 JavaScript 中进行简单检查来执行最后一次检查:字符串长度模 4 应为 0。
所以这导致了这段代码:
function verifyBase64(base64) {
return base64.length % 4 == 0 && /^[A-Za-z0-9+\/]*=?=?$/.test(base64);
}
let base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
base64 = base64.repeat(100000);
console.log(verifyBase64(base64)); // true
console.log(verifyBase64(base64 + "=")); // false
console.log(verifyBase64(base64 + "ab==")); // true