0

これは ${VAR} で機能します。

Pattern.compile("\\$\\{(.+?)\\}"); 

しかし、次の単語境界 (\b) への $VAR も受け入れるようにフォーマットするのに苦労しています。テキストは

$FIRSTVAR.${SECONDVAR}LITERAL

次に、 $FIRSTVAR と ${SECONDVAR} の両方を検出し、最初が「X」の場合、2番目が「Y」の場合は、それをX.YLITERALに置き換えます。テンプレートは $VAR と ${VAR} スタイルの両方を使用し、var の後に単語以外の文字が続く場合は前者を優先しますが、そうである場合は後者を使用します (上記の例のように)。

私は試した

Pattern.compile("\\$(\\{|)(.+?)(\\}|\b})");

しかし、これは group(2) としてFIRSTVAR.${SECONDVARに一致します。だからダメです。前もって感謝します

4

2 に答える 2

1

私は次のように書きます。

Pattern.compile("\\$(?:(\\w+)|\\{(\\w+)\\})")

当然、これはどちら matcher.group(1) matcher.group(2)が変数名になることを意味し、もう一方は変数名になるnullため、両方をチェックする必要があります。

堅牢性の低い別のオプションは、次のように書くことです。

Pattern.compile("\\$\\{?(\\w+))\\}?")

しかし、それは eg$SECONDVAR}ではYなくに置き換わりY}ます。


追加するために編集: Java 7 を使用している場合は、次のように記述できるはずです。

Pattern.compile("\\$(?:(?<varname>\\w+)|\\{(?<varname>\\w+)\\})")

を使用して変数名を取得しますmatcher.group("varname")(私は Java 6 しか手元になく、Java 6 は名前付きキャプチャグループをサポートしていないため、Java ではテストしていません。しかし Perlでは動作します。) .java.util.regex.Patternjava.util.regex.Matcher.group(java.lang.String)

于 2012-10-25T19:15:07.870 に答える
0

新しいパターンを追加したい

Pattern.compile("\\$(\\{?(\\w+)\\}?)\\.?");

次のような後方参照になります: Demoしかし、それは次のようなものと一致$firstvar$secondvar}literalし、正しいかどうかはわかりません。

そして、2つの変数のみの場合...

Pattern.compile("\\$(\\{?(\\w+)\\}?)\\.(?:\\$(\\{?(\\w+)\\}?))?");

デモ 2

デモ 3が必要な場合の 3 回目のレビュー

そして、グループに名前を付けることができることを覚えておいてください(?<groupname>group)

于 2012-10-25T19:34:55.760 に答える