我遇到的问题是,为了对这个查询进行匹配需要很长时间。我正在尝试匹配以下内容:
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]?)+$
我的目标实际上是将第一段内容分成段落,然后使用匹配模式将最后一项收集到列表对象中。我假设两个换行符分隔段落和一组单行项目(只有一个换行符)。
希望这不会令人困惑。我该如何优化这个正则表达式?感谢。
答案 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];
然后您可以使用正则表达式或再次拆分以将列表项彼此分开