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]?)+$

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

希望这不会令人困惑。如何优化这个正则表达式?谢谢。

4

2 回答 2

1

通常可以通过将修饰符添加到和量词来避免耗时、低效的回溯,以使它们懒惰不情愿地匹配,即尽可能少地匹配。 ?*+

.当量词跟随通配符元字符时,这一点尤其重要。

尝试

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

with RegexOptions.Singlelineso.匹配任何字符,包括换行符。
(或者使用[\s\S]代替第一个.)。

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

段落将是match.Groups[1].Value,第一个捕获的单行将是match.Groups[2].Captures[0].Value,第二个match.Groups[2].Captures[1].Value)等。

如果行尾可能很简单\n,请更改\r\n\r?\n.

于 2013-02-18T00:03:05.713 回答
0

我不擅长正则表达式,但你的对我来说似乎很优化。但为了使其更快,请改用 split 将段落与列表分开

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

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

于 2013-02-17T22:10:36.687 回答