2013-02-17 81 views
0

我遇到问题,它需要很长时间才能针对此查询运行匹配。我试图匹配看起来像下面的内容:优化正则表达式

One or more content paragraph of any length 
Here is an optional paragraph 

A single line or list item 
A single line or list item 

这是我的模式。虽然它适用于短表达式,但对于较长的表达式却失败。

^((.+[\r\n]?)+)\r\n\r\n([* -]*(.+)[\r\n]?)+$ 

我的目标的确是将第一段内容分成段落,并使用匹配模式将最后一项收集到列表对象中。我假设两个换行符分隔段落和一组单行项目(只有一个换行符)。

希望这不会造成混淆。我如何优化这个正则表达式?谢谢。

+2

您可以举一个例子,您想从上面给出的例子中看到输出结果吗? – 2013-02-17 21:51:33

+0

如果所有项目看起来都完全相同(现在有错误),您可以使用线阅读器将其拆分并将每两个备用字符串转换为列表。 – cherhan 2013-02-17 21:54:16

+0

你的问题的标题和第一部分是关于表现,然后你说它“失败了更长的”。正则表达式是否太慢或者甚至没有按照您希望的方式运行? – 2013-02-17 22:08:05

回答

1

费时,低效backtracking单独的表项可以常常通过将?修饰词加到*+量词上来使其匹配懒得不情愿,即尽可能少的次数来避免。

当量词符合.通配符元字符时,这可能尤其重要。

尝试

(.+?)\r\n\r\n(?:[* -]*(.+?)(?:\r\n|$))+ 

RegexOptions.Singleline所以.比赛包括换行符的任何字符
(或者使用[\s\S]代替第一个.)。

第一个捕获组将捕获连续换行符之前的所有内容,然后下一个捕获组将捕获随后的每一行。和你的正则表达式一样,单行中的任何前导*,-或空格字符都不会被捕获。

该段/秒将是match.Groups[1].Value,第一捕获单线将match.Groups[2].Captures[0].Value和第二match.Groups[2].Captures[1].Value)

如果行结束可以是简单地\n,更改\r\n\r?\n

0

我并不擅长正则表达式,但你看起来对我来说是非常优化的。但是,使其更快,使用分裂而不是单独从列表

res = yourstring.Split('\r\n\r\n'); 
paragraph = res[0]; 
list=res[1]; 

那么你可以使用正则表达式或再次段落分割成彼此