优化正则表达式

时间:2013-02-17 21:50:09

标签: c# .net regex

我遇到的问题是,为了对这个查询进行匹配需要很长时间。我正在尝试匹配以下内容:

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 个答案:

答案 0 :(得分:1)

通过向?*量词添加+修饰符以使它们与懒惰地匹配

,通常可以避免耗时,低效backtracking em>或不情愿地,即尽可能少的时间。

当量词遵循.通配符元字符时,这一点尤为重要。

尝试

(.+?)\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

答案 1 :(得分:0)

我对正则表达式并不擅长,但你的表现似乎非常优秀。但为了加快速度,请使用split来分隔列表中的段落

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

然后您可以使用正则表达式或再次拆分以将列表项彼此分开