如何创建正则表达式哪些match all invalid Base64
字符?我在堆栈上找到了,[^a-zA-Z0-9+/=\n\r].*$
但是当我尝试时,我得到了带有-
符号的结果字符串。我根本不知道正则表达式,任何人都可以验证这是好还是坏的正则表达式?
问问题
10780 次
2 回答
11
对您的问题的简短回答是,如果消息包含与该类字符的任何匹配项,[^A-Za-z0-9+/=\s]
则它包含无效的 base-64 字符,但 MIME 消息除外,它可以自由地将其他数据(出于各种目的)与 base- 64 流。(这些其他字符在解码 base-64 对象之前被删除。)
作为一个有幸帮助编写一个非常快速的 base 64 编码程序的内部结构的人,该程序使用每条机器指令处理多字节块,让我补充几点:
- base-64 字母表是:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
- 输出必须根据需要用零个或多个
=
符号填充,以便非空白字符的总长度是四的倍数。 - 这些等号只能出现在 base-64 消息的末尾,最多可以有两个。
- 无论是什么类型,都应该忽略空格。通常消息被包装到一定的边距(必须是四的倍数),但这不是必需的。base 64 编码的目的是将任意值(尤其是二进制数据)作为纯文本传输。理论上,您甚至可以使用 base 64 编码通过电话读取某人的 JPEG 图像。
因此,我对验证 base-64 消息的建议不仅仅是使用正则表达式。反而,
- 消除所有空格并调用结果输出的长度
z
。 - 计算
x
base-64 字母字符的数量。 - 计算
y
消息末尾的等号数。 如果
y
最多为 2,则返回有效x + y = z
,否则返回无效。- 注 1:填充字符
==
or=
不用于保护数据的完整性,并且有许多 base-64 编码的派生不使用它们。许多人认为填充几乎与 CRLF 行尾序列的 CR 部分一样无用且浪费处理时间。 - 注意 2:用于 MIME 编码的变体接受要包含在消息流中的 base-64 字母表之外的字符,但在解码 base-64 数据对象时简单地丢弃它们。
- 注 3:我不喜欢现代术语“Base64”,因为它是一个非常难看的词。最初的 base-64 作家从未使用过这个假词,但在接下来的九年中的某个时候被采用了。
- 注 1:填充字符
您可以将其中的大部分编码为正则表达式,如下所示(无需对最后一个 base-64 数据块进行精确的长度检查):
^\s*(?:(?:[A-Za-z0-9+/]{4})+\s*)*[A-Za-z0-9+/]*={0,2}\s*$
于 2013-09-06T15:58:55.137 回答
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 不应包含=
在值中(因为=
具有特殊含义并用作填充符)。
于 2013-09-06T15:34:41.013 回答