2012-01-12 11 views
0
re = new Regex ((.*?)someliteraltext(.*?moreliteral), RegexOptions.Singleline); 
re.Match(c); 

シングルラインが使用されていることに注意してください。改行にマッチします。この正規表現はなぜ遅いのですか?それはより速くすることができますか?

これは約100k文字のテキストで実行され、数分間実行されます。

もっと速くすることはできますか?

+0

開始する '(。*?)'が必要ですか? – Wrikken

+0

これを 'IndexOf'に書き直すのはどうですか? – CodesInChaos

+1

あるいは接頭辞 '^' – CodesInChaos

答えて

3

最も遅くなる可能性が最も高いのは、開始(。*?)というコメントに同意します。最初の "someliteraltext"の前に1000文字がある場合、それはすでに正規表現のその部分の1001の一致です。 @CodeInChaos 'のプレフィックスに^(文字列の先頭)を指定すると、これらの一致を簡単に制限できます。それが受け入れられない場合は、より良い答えを得るために試合で何をしようとしているのかをもっと説明する必要があります。

+0

^うまくいけば、それを試してみるべきだった。 –

2

多くのバックトラックが必要なため、処理が遅いです。ここでの記事:

http://www.regular-expressions.info/engine.html

はあなたにどれだけの仕事、それはやっているのいくつかのアイデアを与えるかもしれません。

@Wrikkenが示唆しているように、最初の "。*?"を削除します。このキャプチャグループは、文字列の先頭から "someliteraltext"までのすべてをキャプチャします。

また、 "IndexOf"を使用して "someliteraltext"を検索し、その後に "moreliteral"を使用します。それは速くなければならない。

関連する問題