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 つの改行が段落と一連の単一行項目 (1 つの改行のみ) を分離していると想定しています。

これが混乱しないことを願っています。この正規表現を最適化するにはどうすればよいですか? ありがとう。

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、2 番目match.Groups[2].Captures[1].Value)などになります。

行末が単純な場合は\n、に変更\r\n\r?\nます。

于 2013-02-18T00:03:05.713 に答える