正则表达式在imap响应中获取文件的base64字符串

regexp to get base64 string of file in imap response

我需要解析 imap 响应以获取文件的 base64 字符串。

字符串是这样的:

--------------A5B0A8B4F69F8BD959B758D0
Content-Type: application/pdf;
 name="Myfile.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Myfile.pdf"

JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlL1hPYmplY3QvQ29sb3JT
ZWI0ODRmNDE1ZDE0YmIyZmU2YjAzZDMzNjU+PGU5MDFiZTMzY2FlOTY4ZDM2
NmFmOGNhOTUxNTE0Nzk0Pl0vSW5mbyAyMyAwIFIvU2l6ZSAyND4+CnN0YXJ0
eHJlZgoyMzg2NgolJUVPRgo=

--------------A5B0A8B4F69F8BD959B758D0--

我需要在 filename="Myfile.pdf" 之后(可能不包括 space)和 =

之后的新行之前得到任何东西

我正在尝试使用此正则表达式但没有成功:

(?<=filename="Myfile\.pdf")(.*)(?=\r\n)

实际上我不确定base64字符串中是否有spaces或换行字符,我不认为。

试试这个正则表达式:

(?<=filename="Myfile\.pdf")\s+((?:\S+\s)+\S+)=

请检查demo

更新:

这个也包括最后一个'='

(?<=filename="Myfile\.pdf")\s+((?:\S+\s)+\S+=)

请检查演示 here

您可以使用

filename="Myfile\.pdf"\s*(\S.*(?:\n\S.*)*)

regex demo详情:

  • filename="Myfile\.pdf" - filename="Myfile.pdf" 字符串
  • \s* - 0 个或更多空格
  • (\S.*(?:\n\S.*)*) - 第 1 组:
    • \S - 一个 non-whitespace 字符
    • .* - 该行的其余部分
    • (?:\n\S.*)* - 0 行或更多行不以空格开头。

Dart/Flutter 获取第一个匹配项的代码:

final base64str = '--------------A5B0A8B4F69F8BD959B758D0\nContent-Type: application/pdf;\n name="Myfile.pdf"\nContent-Transfer-Encoding: base64\nContent-Disposition: attachment;\n\nfilename="Myfile.pdf"\n\nJVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlL1hPYmplY3QvQ29sb3JT\nZWI0ODRmNDE1ZDE0YmIyZmU2YjAzZDMzNjU+PGU5MDFiZTMzY2FlOTY4ZDM2\nNmFmOGNhOTUxNTE0Nzk0Pl0vSW5mbyAyMyAwIFIvU2l6ZSAyND4+CnN0YXJ0\neHJlZgoyMzg2NgolJUVPRgo=\n\n--------------A5B0A8B4F69F8BD959B758D0--';
final rx = RegExp(r'filename="Myfile\.pdf"\s*(\S.*(?:\n\S.*)*)');
final match = rx.firstMatch(base64str);
if (match != null) {
  print(match.group(1));
}

输出:

JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlL1hPYmplY3QvQ29sb3JT
ZWI0ODRmNDE1ZDE0YmIyZmU2YjAzZDMzNjU+PGU5MDFiZTMzY2FlOTY4ZDM2
NmFmOGNhOTUxNTE0Nzk0Pl0vSW5mbyAyMyAwIFIvU2l6ZSAyND4+CnN0YXJ0
eHJlZgoyMzg2NgolJUVPRgo=