Posix RegEx用于解析电子邮件消息 - 如何在第一次出现边界后停止

时间:2013-08-24 12:24:00

标签: regex email-parsing

我正在研究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--

现在我需要获得不同类型的消息(plain和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

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

1 个答案:

答案 0 :(得分: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