2017-09-05 5 views
1

私は通常より少し長いこの正規表現を持っています。テキスト文書でいくつかの値を取得しようとしています。Java正規表現パターンが長すぎますか?

\\n*.*(k\\s=\\s\\d)(.|\\n)*?estimate\\s.*\\n*\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s+ 

それはregexr.com link

に完全に正常に動作しますが、Javaで唯一のこの部分は、すぐに私はそれが動作を停止行方不明の 'e' を追加として

\\n*.*(k\\s=\\s\\d)(.|\\n)*?estimat 

に動作します。

今のところ私はいくつかのグループが間違って記入されていることを無視しています。

何が問題になるのですか?

+2

奇妙な音ですが、それを再現するJavaコードのスニペットを投稿できますか? – Aaron

+1

入力文字列を監視します。 – revo

+1

あなたのケースでは、私は完全に最初の正規表現とのテキストを分割し、私は興味のある値を2番目の正規表現以上で分析するだろう。 1つの正規表現ですべてを行うことは、$$ – Oneiros

答えて

3

(.|\\n)*?は、正規表現エンジンがあまりにも多くの冗長バックトラッキングステップを実行するようにします。パターン内のそのような部分を、改行文字を含む0以上の任意の文字に一致する修飾子グループの(?s:.*?)に置き換える必要があります。交替がないので、ここで冗長バックトラッキングはありません。

注その正規表現エンジンが全くインライン修飾子をサポートしていないとして、JavaScriptの(唯一のJavaScript正規表現のフレーバーをサポートしていますがregexr.comでパターンをテストしているとこと)で、(.|\n)*?[^]*?または[\s\S]*?に交換する必要があること。