令人痛苦的缓慢的正则表达式

本文关键字:缓慢 正则表达式 痛苦 | 更新日期: 2023-09-27 18:00:34

我正在尝试解析一封格式化的电子邮件,它看起来像这样:

From: Mr. Bob Simon Jones
Email: moo@cows.com
Comments: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris hendrerit, nibh a  tristique malesuada, tellus nibh pharetra mauris, id tincidunt lacus turpis vel risus. 
Vestibulum laoreet venenatis mauris sit amet suscipit. Cras vel pharetra nisl. Suspendisse venenatis ante quis tellus luctus id ornare sem pretium. Cras sodales tristique mauris sagittis ullamcorper. 
Ut sit amet urna magna. Nullam et odio sit amet mauris tempus egestas. Donec eget risus nec lectus adipiscing convallis. Pellentesque in velit enim. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi quis ante diam. Etiam rhoncus leo vulputate ligula luctus volutpat. Praesent luctus, justo eget auctor viverra, diam turpis fringilla elit, non commodo massa arcu et eros. Cras elementum faucibus elit, sollicitudin luctus mi dictum a.
Address: First line, Second Line, Third line pe2 8pd, Fourth Line
Date of Visit: 25/06/2011

我有一个正则表达式,如果它是唯一存在的文本,它就可以工作,但当它速度慢得离谱之后出现大量垃圾文本时,在.NET应用程序中运行时,它似乎根本无法完成。

正则表达式为:

.*From: (?<title>Mrs'.|Mr'.|Miss'.|Ms'.) (?<firstName>('w| )*)(?<=. )(?<surname>('w| )*)'s*
Email: (?<email>.*)'s*
Comments: (?<comments>(.|'s)*)'s*
Address: (?<address1>[^,]*), (?<address2>[^,]*), (?<address3>[^,]*),(?<address4>.*)'s*
Date of Visit: (?<dateOfVisit>'d'd/'d'd/'d'd'd'd).*

第一行查找除了最后一个之外的每个名字,并将其用作名字,将姓氏用作姓氏。

我想这可能与此有关:http://www.regular-expressions.info/catastrophic.html

但我想不通。想知道是否有人能为我指明正确的方向?

感谢您抽出时间

令人痛苦的缓慢的正则表达式

Yikes。你一下子想做的太多了。将其分解为更小的部分:

  1. 首先,获取每个字段的原始值。例如,位于From:Email:之间的所有内容都是名称。不要试图变得聪明——要盲目。name的内容还不重要,只是blob。

  2. 分别对待每个值,并将其作为一个具有自己规则的不同值进行独立处理。有些可能是日期,有些可能是带标题的名称,等等。你可以写一个小的、更简单的正则表达式,将这些更特殊的数据转换成有意义的格式。

这只是一个建议,但您是否尝试使用已编译的Regex?以下是一些信息:http://en.csharp-online.net/CSharp_Regular_Expression_Recipes%E2%80%94Compiling_Regular_Expressions

以下是regex的一些增强功能,您能测试一下吗?

From: (?<title>(?:Mrs|Mr|Miss|Ms)'.) (?<firstName>['w ]*)(?<=. )(?<surname>['w ]*)'s*
Email: (?<email>.*)'s*
Comments: (?<comments>(.*))'s*
Address: (?<address1>[^,]*), (?<address2>[^,]*), (?<address3>[^,]*),(?<address4>.*)'s*
Date of Visit: (?<dateOfVisit>'d{2}/'d{2}/'d{4})

单行选项

一起使用