2013-02-17 120 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]; 

那麼你可以使用正則表達式或再次段落分割成彼此