回答ありがとうございます。
「処理時間が非常にかかっている」というもの十分考えられるとおもいますが、今回の検索パターンではバックトラックはあまり発生しないと思いますので、それほどの時間はかからないはずと思います。(勝手な思い込みかもしれませんが)
また、Matchで検索結果を順番に取得した場合、最後の検索結果までは特に問題なく実行できます。
フリーズするのは、最後のその次をNextMatchで取得する時に発生しているようです。
プログラムでは次のような感じです。
dim ma as match = Regex.Match(src, pat)
do while ma.Success
xxxxx
ma = ma.NextMatch
loop
最後の次をNextMatchで取得するとSuccess=Falseになっているはずですが、これを取得するタイミングで戻ってきません。
いくつかの対象テキストで試しましたが、このタイミングは同じでした。
(数行程度のテキストでは確かにOKでした。しかし30行程度でもNGです)
具体的なテキストとプログラムがあったほうが良さそうなので、用意してみます。
お礼
どうも甘く見ていたようです。 「ちなみ・・」のように (?>(".*?"|[^"']+))*('.*?)\r\n や (".*?"|(?>[^"']+))*('.*?)\r\n とすると検索できました。 よく考えると、パターンそのものは、テキストの先頭から最後のコメント部分までは全部、最長での一致範囲なのでバックトラックが発生しないが、最後のコメントからテキスト末尾にパターンが一致しないことを判定するのにバックトラックが発生して長考しているようです。 (".*?"|[^"']+)*(('.*?)\r\n|$) としてもフリーズしませんでした。 もうちょっと細部を確認したいので、来週まで保留にさせてください。
補足
perlでも実行して同様にフリーズすることを確認しました。 「バックトラックで長考している」で納得できました。 (?> ..)などで回避するようにします。 回答ありがとうございました。