如何提取MIME消息中多行连续的Base64编码内容?
提取MIME消息中整块Base64内容的正则方案
问题背景
从MIME消息中提取Base64编码内容时,原有正则会逐行匹配Base64字符串,无法将同一分隔块内的多行内容合并为单个匹配。当内容包含PGP签名这类多段Base64时,会得到零散的多个匹配结果,无法直接拼接使用。
例如这段MIME内容:
--------------ra650umTsDNeI5lwXmFy5luF Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 TG9yZW0gSXBzdW0NCg0KSGVyZSBpcyBzb21lIG1vcmUgdGV4dA0KDQpOb3cgb24gYSAzcmQg bGluZQ0KDQoNClRoYW5rcw0KDQo= --------------ra650umTsDNeI5lwXmFy5luF--
原有正则(仅匹配单行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
改进后的正则
var base64Regex = /(?:^[A-Za-z0-9+\/]{4}(?:[A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}={2})?\s*)+(?=\s*----------)/gm
正则逻辑说明
- 多行匹配合并:
(?:^[A-Za-z0-9+\/]{4}(?:...)?)匹配单行合法Base64,外层的+允许将连续多行Base64合并为一个匹配项,\s*兼容行尾的换行或空白字符 - 块边界识别:
(?=\s*----------)是正向预断言,确保匹配的Base64内容后紧跟MIME分隔线(允许分隔线前有空白),以此精准界定单个Base64块的结束位置
效果
该正则会将同一MIME分隔块内的所有Base64行合并为单个匹配结果;若存在多个独立的Base64块,会分别生成对应的匹配项,直接获取后即可解码使用。
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

