regexp для получения строки файла base64 в ответе imap - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно проанализировать ответ 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" (возможно, без пробела) и перед новой строкой после =

Я безуспешно пытаюсь использовать это регулярное выражение:

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

На самом деле я не уверен, есть ли пробелы или символы новой строки в строке base64 не думаю.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Вы можете использовать

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

См. демонстрацию регулярных выражений . Подробности :

  • filename="Myfile\.pdf" - a filename="Myfile.pdf" строка
  • \s* - 0 или более пробелов
  • (\S.*(?:\n\S.*)*) - Группа 1:
    • \S - символ без пробелов
    • .* - остальная часть строки
    • (?:\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=
1 голос
/ 04 августа 2020

Попробуйте это регулярное выражение:

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

Пожалуйста, проверьте demo .

Обновление:

Это включает также последний знак '='

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

Пожалуйста, проверьте демонстрацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...