regex NodeJS正则表达式测试函数生成范围错误

k10s72fa  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(77)

我需要检查一个特定的字符串是否是一个有效的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字符串分成更小的字符串并单独测试吗?

wqnecbli

wqnecbli1#

有以下规则需要检查:
1.最多允许两个=符号,并且它们应该位于输入的最后
1.所有其他字符应为字母数字或+/
1.总输入长度必须是4的倍数
正则表达式中的([A-Za-z0-9+/]{4})*部分将使正则表达式引擎为每出现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

相关问题