如何创建match all invalid Base64
个字符的正则表达式?
我在堆栈[^a-zA-Z0-9+/=\n\r].*$
上找到了,但是当我尝试时,我得到了带有-
符号的结果字符串。
我根本不知道正则表达式,任何人都可以验证这是好还是坏的正则表达式?
答案 0 :(得分:8)
对您的问题的简短回答是,如果邮件包含来自类[^A-Za-z0-9+/=\s]
的字符的任何匹配,那么它包含无效的base-64字符,除了可以自由混合其他数据的MIME邮件(用于各种用途)与base-64流一起使用。 (在解码base-64对象之前删除这些其他字符。)
作为一个有幸帮助编写一个非常快速的基本64位编码程序内部的人,用每个机器指令处理多字节块,让我补充几点:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
=
符号,以便非空白字符的总长度为4的倍数。因此,我建议验证base-64消息不仅仅是使用正则表达式。取而代之的是,
z
的长度。x
。y
。如果y
最多为2且x + y = z
,则返回有效,否则无效。
==
或=
不起任何保护数据完整性的目的,并且有许多base-64编码的衍生产品不使用它们。许多人认为填充几乎与CRLF行结束序列的CR部分一样无用且浪费处理时间。您可以将大部分内容编码为正则表达式,如下所示(不对最后一个base-64数据块进行精确的长度检查):
^\s*(?:(?:[A-Za-z0-9+/]{4})+\s*)*[A-Za-z0-9+/]*={0,2}\s*$
答案 1 :(得分:2)
应该是^[a-zA-Z0-9+/\r\n]+={0,2}$
1 。
目前它只匹配一个有效字符,然后允许后面的任何内容。所以,例如:
aGVsbG8sIHdvcmxkIQ== match
aGV%sb-G8sIHdvcmxkIQ== also a match (starts with "a")
最后删除.*
,并在类中添加量词,它会强制整个字符串合法:
aGVsbG8sIHdvcmxkIQ== match
aGV%sb-G8sIHdvcmxkIQ== not a match
1 正如@pswg指出的那样,有效的base64不应该在值中包含=
(因为=
具有特殊含义,用作填料。