5

I am a noob to regex.

I have string like:-

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

and i have to extract all patterns matched with this type ${....}

Like:- for given str result should be

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

further if it finds any duplicates then gives only one . for ex:-

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

result should be:-

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

only

this is my answer:-

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

but this one not giving the correct result. it gives only

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

So please suggest me correct regex.

4

2 に答える 2

6

あなたは.単語の間を考慮していません。\\wは含まれませんdot(.)

パターンを次のように変更する必要があります: -

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

dot(.)すべてに一致し、それがあなたが望むものですよね?

また、ここではreluctant量指定子を使用しました。これは、欲張りな量指定子を使用すると、最後の が見つかるまで途中で も一致するため、最初の.+?after のみに一致する}ようにします。{(.+)dot(.)}}


アップデート: -

一意の値だけを取得するには、次のパターンを使用できます: -

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

同じパターンを含む文字列が後に続かないパターンのみに一致します。

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

\1は に使用されbackreferencingますが、バックスラッシュでエスケープする必要があるため\\1、 と(?!...)が に使用されnegative look aheadます。

于 2012-11-08T09:11:41.963 に答える
1

.それは、が に含まれていないため\wです。次に、独自の文字クラスを作成し、そこに追加する必要があります。

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

ここの Regexrのパターンを参照してください。

ただし、これは重複を避けたいという問題を解決しませんが、それは正規表現の仕事ではありません。

中括弧の間にさらに異なる文字が存在する可能性がある場合、Rohits の回答の方が優れています。これは、右括弧までの任意の文字と一致します。

于 2012-11-08T09:12:39.917 に答える