2012-01-22 11 views
1

を動的に作成するには正規表現変数パラメータの数は?Java:実行時に可変引数を使って正規表現を正しく構築する方法

など。私の正規表現は以下のようであれば:

String REGEX = "\\b(?:word1(?:(\\s+)word2(?:(\\s+)word3)?)?)"; 

私は動的にwordX交換/正規表現文字列の受け渡しを作成したいと私は、例えば言葉の可変数を渡したいですわずか2またはおそらく7である。

e.e.e.

REGEX = "\\b(?:cat(?:(\\s+)mouse(?:(\\s+)rain)?)?)"; 

1回の呼び出しで、もう中:

REGEX = "\\b(?:cat(?:(\\s+)mouse(?:(\\s+)rain(?:(\\s+)blue(?:(\\s+)?)?)?)?)?)"; 

正規表現は、それがうまく支えられていることを提供受け入れられる可能性がこれらの構造には適していないという答えになってしまいます。

+0

3番目の表現は、最初の2つと同じ形式ではありません(グループは同じ方法でネストされません - 'rain)(?:空)。だから私はあなたがしようとしていることを理解していない。 – Mat

+0

ああこれはコピーペーストでした。これは前のと同じですが2つの余分な引数があります。その式はその順序でタームを見つけるはずです。それがすべてのタームと一致しない場合は、 – Cratylus

答えて

4

あなたが与えた最初の例の形で正規表現の文字列を生成します再帰関数書くことができます:あなたはこのコードを自分でテストし、デバッグする必要がありますが、それはあなたのアイデアを与える必要があります

String generateRegex(List<String> words) 
{ 
    if(words.isEmpty()) return ""; 
    String word = words.remove(0); 
    return "\\b(?:" + word + generateInnerRegex(words) + ")"; 
} 

String generateInnerRegex(List<String> words) 
{ 
    if(words.isEmpty()) return ""; 
    String word = words.remove(0); 
    return "(?:(\\s+)" + word + generateInnerRegex(words) + ")?"; 
} 

を。

+0

+ 1.これはうまくいくようですが、私がこのようなことをしてしまうのであれば、正規表現が最初に適切ではないかもしれないと心配しています。 – Cratylus

+0

どうしてですか?コードは8行のみです(中括弧は含みません)。 indexOf()やその他の低レベルのStringメソッドを使用して、何かを一緒にハッキングしてより簡潔にすることができますか?もしあなたがしたら、バグなしでそれを働かせる方が簡単でしょうか?それは速く走るだろうか? 3つの質問すべてに対する答えはノーだと思います。正規表現とのテキストのマッチングは速く、おそらく手でハッキングされたコードよりも高速です。私のコードの改善点の1つは、コードが何をしているのか、理由を説明するコメントを2つ追加することです。 –

関連する問題