如何解决正则表达式解析中间的 MIME 消息体如何?
我正在编写 IMAP4 备份应用程序。经过大量研究,我找到了正确的 IMAP 命令来返回所有消息或一系列消息。
SS01 UID FETCH 1:* BODY[]
这个漂亮的命令以以下格式返回数据:
* 1 FETCH (UID 2 BODY[] {7765}
data to be extracted
from here! which can possibly contain
) <--- one or more prior to its final...
)
* 2 FETCH (UID 3 BODY[] {443}
data to be extracted
from here! which can possibly contain
) <--- one or more prior to its final...
)
* 3 FETCH (UID 4 BODY[] {4432}
data to be extracted
from here! which can possibly contain
) <--- one or more prior to its final...
)
* 4 FETCH (UID 5 BODY[] {123}
data to be extracted
from here! which can possibly contain
) <--- one or more prior to its final...
)
SS01 OK Success
我能在本文中找到的唯一独特模式是:
第一条消息以...开头
1 FETCH (UID 2 BODY[] {7765}
每条不是最后一条的消息都以......结束
)
* 2 FETCH (UID 3 BODY[] {443}
最后一条消息以...结束
)
SS01 OK Success
我在我正在尝试实施但没有成功的网站上找到了以下示例。
正则表达式模式是:
(?<=This is)(.*)(?=sentence)
这是一个不起作用的最小可重现示例。
(\*\s\d+\s\w+\s\(UID\s\d+\sBODY\[\]\s\{\d+\})(.*\n)(\)\n\*\s\d+\s\w+\s\(UID\s\d+\sBODY\[\]\s\{\d+\})
解决方法
您可以像这样大大简化您的正则表达式:
\{\d+\}$[\r\n]+([\s\S]+?)^\)$
-
\{\d+\}$
- 在行尾查找{digits}
-
[\r\n]+
- 捕获任何新行 -
([\s\S]+?)
- 粗略地捕获所需的文本,直到:(阅读以下要点) -
^\)$
- 查找仅包含右括号)
的行
您想要的文本将在捕获组 #1 中
https://regex101.com/r/A86eEv/1/
var regex = /\{\d+\}$[\r\n]+([\s\S]+?)^\)$/gm;
var text = `* 1 FETCH (UID 2 BODY[] {7765}
data to be extracted
from here!
)
* 2 FETCH (UID 3 BODY[] {443}
data to be extracted
from here!
)
* 3 FETCH (UID 4 BODY[] {4432}
data to be extracted
from here!
)
* 4 FETCH (UID 5 BODY[] {123}
data to be extracted
from here!
)
SS01 OK Success`;
var matches = [...text.matchAll(regex)];
console.log(Array.from(matches,x => x[1].trim()));
你可以使用
/\* \d+ FETCH \(UID \d+ BODY\[] {\d+}\s*([\s\S]*?)(?=\)[\r\n]+(?:\* \d+ FETCH \(UID \d+ BODY\[] {\d+}|SS01 OK Success))/g
参见regex demo。或者,如果您不需要如此彻底地检查所有上下文,请使用
/{\d+}\s*([\s\S]*?)(?=\))/g
详情:
-
\* \d+ FETCH \(UID \d+ BODY\[] {\d+}
-*
,空格,一位或多位数字,空格,FETCH
,空格,(UID
,空格,1+ 位数字,空格,{{1} },空格,BODY[]
,一位或多位数字,{
-
}
- 零个或多个空格 -
\s*
- 第 1 组(您需要获取的值):尽可能少的零个或多个字符 -
([\s\S]*?)
- 正向前瞻,需要紧接当前位置右侧的以下模式序列:-
(?=\)[\r\n]+(?:\* \d+ FETCH \(UID \d+ BODY\[] {\d+}|SS01 OK Success))
-\)
字符 -
)
- 一个或多个 CR 或 LF 字符 -
[\r\n]+
- 任一-
(?:\* \d+ FETCH \(UID \d+ BODY\[] {\d+}|SS01 OK Success)
-\* \d+ FETCH \(UID \d+ BODY\[] {\d+}
,空格,一位或多位数字,空格,*
,空格,FETCH
,空格,1+ 位数字,空格,{{1} },空格,(UID
,一位或多位数字,BODY[]
-
{
- 或 -
}
-|
字符串。
-
-
JavaScript 演示:
SS01 OK Success
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。