1

如何创建正则表达式哪些match all invalid Base64字符?我在堆栈上找到了,[^a-zA-Z0-9+/=\n\r].*$但是当我尝试时,我得到了带有-符号的结果字符串。我根本不知道正则表达式,任何人都可以验证这是好还是坏的正则表达式?

4

2 回答 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 消息的建议不仅仅是使用正则表达式。反而,

  1. 消除所有空格并调用结果输出的长度z
  2. 计算xbase-64 字母字符的数量。
  3. 计算y消息末尾的等号数。
  4. 如果y最多为 2,则返回有效x + y = z,否则返回无效。

    • 注 1:填充字符==or=不用于保护数据的完整性,并且有许多 base-64 编码的派生不使用它们。许多人认为填充几乎与 CRLF 行尾序列的 CR 部分一样无用且浪费处理时间。
    • 注意 2:用于 MIME 编码的变体接受要包含在消息流中的 base-64 字母表之外的字符,但在解码 base-64 数据对象时简单地丢弃它们。
    • 注 3:我不喜欢现代术语“Base64”,因为它是一个非常难看的词。最初的 base-64 作家从未使用过这个假词,但在接下来的九年中的某个时候被采用了。

您可以将其中的大部分编码为正则表达式,如下所示(无需对最后一个 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 回答