0

我正在研究 MIME 格式的电子邮件解析器。我被迫使用用 C 编写的“posix regex”库,我想知道它的行为。

假设我们有以下部分电子邮件:

--------------010402010107070509040804
Content-Type: text/plain; charset=ISO-8859-2
Content-Transfer-Encoding: 8bit

plain message

--------------010402010107070509040804
Content-Type: text/html; charset=ISO-8859-2
Content-Transfer-Encoding: 8bit

html message

--------------010402010107070509040804--

现在我需要获取不同类型的消息(纯文本和 html)。我使用以下模式来获取边界之间的数据:

^((.|\\s)+?)--------------010402010107070509040804

这种模式在一些 RegEx 库中运行良好。例如,当我在 javascript 中编写相同的正则表达式过程时,我能够毫无问题地获取这两个部分的消息。

但是,“posix regex”库会在最后返回整个消息,不包括“--”。这是它的结果:

--------------010402010107070509040804
Content-Type: text/plain; charset=ISO-8859-2
Content-Transfer-Encoding: 8bit

plain message

--------------010402010107070509040804
Content-Type: text/html; charset=ISO-8859-2
Content-Transfer-Encoding: 8bit

html message

--------------010402010107070509040804

为什么在普通消息后找到第一次出现边界后它没有停止?我错过了什么吗?

4

1 回答 1

0

POSIX 没有贪婪修饰符,有一种方法可以做到,但它又丑又长。为了简化,假设令牌要短得多,比如--123,你需要这个正则表达式:

^(([^-]|-[^-]|--[^1]|--1[^2]|--12[^3])+)

对于如此简单的事情来说,这已经很长了。基本上你是在告诉正则表达式你想要重复任何不是的东西,-或者后面- 跟着任何不是的东西-,或者--后面跟着任何不是的东西,1等等。

我制作了一个脚本来从输入令牌生成一个正则表达式并运行它,--------------010402010107070509040804它给了我这个:

^(([^-]|-[^-]|--[^-]|---[^-]|----[^-]|-----[^-]|------[^-]|-------[^-]|--------[^-]|---------[^-]|----------[^-]|-----------[^-]|------------[^-]|-------------[^-]|--------------[^0]|--------------0[^1]|--------------01[^0]|--------------010[^4]|--------------0104[^0]|--------------01040[^2]|--------------010402[^0]|--------------0104020[^1]|--------------01040201[^0]|--------------010402010[^1]|--------------0104020101[^0]|--------------01040201010[^7]|--------------010402010107[^0]|--------------0104020101070[^7]|--------------01040201010707[^0]|--------------010402010107070[^5]|--------------0104020101070705[^0]|--------------01040201010707050[^9]|--------------010402010107070509[^0]|--------------0104020101070705090[^4]|--------------01040201010707050904[^0]|--------------010402010107070509040[^8]|--------------0104020101070705090408[^0]|--------------01040201010707050904080[^4])+)

据我所知,一个野兽,但最好的 POSIX 可以做到:P

于 2013-08-24T15:01:28.620 回答