CSV ファイルを読み取るために、Java で次の正規表現を使用しています。
Pattern csvline = Pattern.compile("((([^\\\"]|\\\"\\\")+|\\\"([^\\\"]|\\\"\\\")+\\\"))*", Pattern.DOTALL);
この式は、このオンライン正規表現テストに合格します。ただし、実行すると常にStackOverflowError
.
いくつかの調査の後、解決策は式を次のように置き換えることであることがわかりました
Pattern csvline = Pattern.compile("((([^\\\"]|\\\"\\\")++|\\\"([^\\\"]|\\\"\\\")++\\\"))*", Pattern.DOTALL);
ここでは貪欲な量指定子の代わりに所有量指定子を使用します。この場合、それは最適化とも言えます。
私の質問は、Java は多くのバックトラッキングを処理できないため (スタック スペースを消費するため、優れたエンジンはそうではないと私は信じています)、StackOverflowError
正規表現が原因であることがわかったときはいつでも最適化を検討する必要があるということです。バックトラッキングを減らす方法は?