2012-11-08 19 views
5

私は正規表現のnoobです。

Iのような文字列がある: - 私はこのタイプ$ {...}

等と一致するすべてのパターンを抽出する必要が

String str = "sbs 01.00 sip ${dreamworks.values} print ${fwVer} to 
       used ${lang} en given ${model} in ${region}"; 

と : - 所与STR結果に対して

なければなりません
${dreamworks.values} 
${fwVer} 
${lang} 
${model} 
${region} 

さらに重複が検出された場合は、1つのみを返します。 EX用 : -

String feed = "sip ${dreamworks.values} print ${fwVer} to ${fwVer} used 
       ${lang} en ${lang}given ${model} in ${region}" 

結果は次のようになります -

${dreamworks.values} 
${fwVer} 
${lang} 
${model} 
${region} 

のみ

これが私の答えです: -

PLACEHOLDER_PATTERN = "\\$\\{\\w+\\}"; 

が、この1つは正しい結果を与えていません。 それだけを与える

${fwVer} 
${lang} 
${model} 
${region} 

私は正式な正規表現をお勧めします。

+1

"dreamworks.values"にはaが含まれているためです。それで –

答えて

6

単語の間に.は含まれていません。 \\wにはdot(.)が含まれていません。あなたがあなたのパターンを変更する必要が

: -

PLACEHOLDER_PATTERN = "\\$\\{.+?\\}"; 

dot(.)は、すべてのものと一致し、それはあなたが右の何をしたいのですか?あなたが貪欲な数量詞(.+)を使用している場合、それは最後の}を見つけるまで、dot(.)もの方法で}と一致しますので、それが唯一、{後の最初の}と一致するように.+? -

また、私はここでreluctant数量詞を使用していました。


UPDATE: -

だけで一意の値を取得するには、あなたはこのパターンを使用することができます -

"(\\$\\{[^}]+\\})(?!.*?\\1)" 

をそれは続いていないだけで、これらのパターンを、一致します同じパターンを含む文字列。

注:ここでは、.+?の代わりに[^}]を使用しました。 }以外の任意の文字に一致します。したがって、今の場合、reluctant量子は必要ありません。

\1

backreferencingのために使用されているが、我々は、バックスラッシュでエスケープする必要があり、したがって \\1を、そして (?!...)negative look aheadのために使用されています。

+0

しかし、ストリングフィードはどうですか?どのように私は一意の値を取得するのですか? – user1808653

+0

この '文字列フィード 'とは何ですか?もう少し説明できますか? –

+0

文字列フィード= "sip $ {dreamworks.values} $ {fwVer}は$ {lang}を使用して$ {lang}を$ {lang}使用しました。与えられた例では、重複した文字列のフィードについては他のケースを参照してください。 – user1808653

1

.\wに含まれていないためです。独自のcharacter classを作成してそこに追加する必要があります。

PLACEHOLDER_PATTERN = "\\$\\{[\\w.]+\\}"; 

パターンhere on Regexrを参照してください。

しかし、これは問題を解決しません。重複は必要ありませんが、これは正規表現の仕事ではありません。

中括弧の間にさらに異なる文字がある場合は、Rohits answerが良いです。これは、閉じ括弧までの任意の文字と一致します。

+0

エスケープされていない '.'は、括弧で囲まれた括弧とあなたの貪欲な数量子とも一致します... – jlordo

+1

@jlordo、文字クラス内ではありません。ドットは単なるドットで、特別なものはありません。 – stema

+0

@stema - あなたは正しいです、答えてくれてありがとう、毎日新しいことを学びます:) – jlordo