2010-12-02 12 views
1

正規表現パターン - ([^=](\\s*[\\w-.]*)*$)Javaの正規表現エンジンクラッシュ

テストストリング - paginationInput.entriesPerPage=5

Javaの正規表現エンジンクラッシュ/一致発見年齢(> 2mins)をとります。これは、次のテスト入力のためのケースではありません。

paginationInput=5 

paginationInput.entries=5 

私の要件は、=右側に文字列のホールドを取得し、何かに置き換えることです。上記のパターンは、上記の入力を除いてうまくやっています。

私は他の特異な例を回避するために、エラーとどのように私は私の要件のための正規表現を最適化することができます理由を理解したいと思います。

+3

正規表現は行き過ぎと思われる、このファイルの各行にtestString.splitを(「=」)を使用して、その長さ== 2のチェックについて考えていますか?すなわち、配列を返し、2番目の項目はそれを行うために、粗方法だ= –

+0

の右側であろう。私はそれを私の最後の手段として残しています。 – kaychaks

+1

それはすぐに一致しない場合、あなたはおそらくスタックオーバーフローを取得しているので、あなたの正規表現で許可されてあまりにも多くのバックトラックがあります。 *ネストすることを避けるようにしてください。そうしないと、あなたがそれらを所有することができますか? – CurtainDog

答えて

1

あなたはあなたの文字列が=後の文字から始まることを確認するために背後を見て使用することができます。それがクラッシュしている理由については

(?<=\\=)([\\s\\w\\-.]*)$ 

を、それが第二ですグループの周りの*

  • 単一の文字、何が、次のグループの
  • そして、0回以上の繰り返し等しい:
    • どれをあなたはそれがあなたのように聞こえるので、求めている、ことを必要とする理由私はわかりません文字列
    の空白の量
  • 次に任意の単語文字の量、ダッシュ、ドット
  • 終了とにかく

    、その*を取り出して、それはもう永遠に回転しないが、私はまだ後ろの外観を使用して、より具体的な正規表現のために行くと思います。

    また、私はあなたがこれを使用しているのか分からないが、なぜあなたはそこに$を持っていましたか?その後、文字列内の最後のものとマッチすることができます(複数ある場合)。それはあなたが新しい行に先読みを持つ方が良いだろうように思えるまたはエンド:(?=\\n|$)

    [編集]:以下のコメントあたりを更新。

  • +0

    あなたのパターンは文字列に "="のRHSを与えません "something.operer = asda adad" それは単語の間にスペースがあるので、私の2番目のものは、これらの事例を管理することでした。文字列ごとに1つだけ一致するので、 "$"を使用することができます – kaychaks

    +0

    ああ、右側にスペースがあれば、別の '*'を追加するのではなく、 '\\ s'を文字クラスに移動してください。パターンがそれよりも厳しい場合は、繰り返しグループのみが必要です。私の答えも更新されました。 – Nicole

    +0

    私はすでにそれを行い、ここで更新しようとしていました。とにかく助けてくれてありがとう。 – kaychaks

    0

    これを試してみてください:

    =\\s*(.*)$