【问题标题】:Javascript Regex multi-line base64Javascript正则表达式多行base64
【发布时间】:2022-11-21 04:32:07
【问题描述】:

我从 MIME 消息中得到以下内容;

--------------ra650umTsDNeI5lwXmFy5luF
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: base64

TG9yZW0gSXBzdW0NCg0KSGVyZSBpcyBzb21lIG1vcmUgdGV4dA0KDQpOb3cgb24gYSAzcmQg
bGluZQ0KDQoNClRoYW5rcw0KDQo=

--------------ra650umTsDNeI5lwXmFy5luF--

我想提取 base64 编码的消息,不管它有多少行。

以下确实会在每一行上找到匹配项,但是我如何对它们进行分组,以便如果有多行 base64 匹配,它将它们分组为“一起”

var base64Regex = /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}={2})$/gm

例如,当 MIME 内容还包含 PGP 签名时,这会给我 4 或 5 个匹配项,所以我不能简单地加入它们,因为它也会找到 base64。

理想情况下,我会修改它,以便它获取从/包括第一个匹配项到 ---------- 的所有内容,并说这是“匹配 1”,如果它找到另一个 base64 块,那就是“匹配 2”,等等。

这是显示 2 个匹配项的 regex101 的链接。简而言之,我希望这是一场比赛。

https://regex101.com/r/32WjKa/1

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    这会有帮助吗?

    var base64Regex = /Content-Transfer-Encoding: base64([sS]*?)s*?--/g;
    

    Content-Transfer-Encoding: base64 - 这是 base64 编码消息的开始。

    [sS]*? - 这是 base64 编码的消息。它可以在多行上。

    s*? -- - 这是 base64 编码消息的结尾。

    g - 这是全局标志,因此它将匹配正则表达式的所有实例

    【讨论】:

      【解决方案2】:

      我不会寻找 base64 字符,而是寻找 HTTP 有效负载开始和结束之间的所有字符(包括换行符)。

      默认情况下,Javascript 正则表达式中的 .,即使在多行模式下,也不会匹配换行符。但是 /s 标志允许 . 匹配换行符。

      使用此方法,您可以在与简单的 replace() 匹配后删除换行符

      const str = `--------------ra650umTsDNeI5lwXmFy5luF
      Content-Type: text/plain; charset=UTF-8; format=flowed
      Content-Transfer-Encoding: base64
      
      TG9yZW0gSXBzdW0NCg0KSGVyZSBpcyBzb21lIG1vcmUgdGV4dA0KDQpOb3cgb24gYSAzcmQg
      bGluZQ0KDQoNClRoYW5rcw0KDQo=
      
      --------------ra650umTsDNeI5lwXmFy5luF--`
      
      const payload = str.match(/base64
      
      (.+)
      
      --------------.+/ms)[1].replace(/
      /g, '')
      

      您最好还是使用 body-parser 之类的东西,因为这样的 HTTP 有效负载是标准的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        相关资源
        最近更新 更多