2017-03-06 2 views
0

正規表現に貧弱です。私はグーグルでそれを基本的に理解していました。Javaのパターンマッチングの問題

私は以下の要件を持っています: 私のコマンドには、 "$(VAR_NAME)"パターンの文字列が含まれている場合があります。そのような文字列があるかどうかを調べる必要があります。もしそうなら、私はそれらを解決しなければなりません(私はそのような文字列があれば何をすべきか知っています)。 しかし、問題は、コマンドに "$(VAR_NAME)"パターンの文字列があるかどうかを調べる方法です。私のコマンドには、このような文字列パターンが複数またはゼロかもしれません。

私の知るところでは、以下のコードを書いています。私が使用する場合は、'pattern1'、以下のコードでは一致しています。しかし、ではない'pattern' 誰かがこれを助けることができますか?

ありがとうございます。

final String command = "somescript.file $(ABC_PATH1) $(ENV_PATH2) <may be other args too here>"; 
    final String pattern = "\\Q$(\\w+)\\E"; 
    //final String pattern1 = "\\Q$(ABC_PATH1)\\E"; 

    final Pattern pr = Pattern.compile(pattern); 
    final Matcher match = pr.matcher(command); 
    if (match.find()) 
    { 
     System.out.println("Found value: " + match.group(0)); 
    } 
    else 
    { 
     System.out.println("NO MATCH"); 
    } 

答えて

1

\ Qと\ Eを使用すると、丸括弧が文字通り解釈されるため、変数名のキャプチャグループを設定できないことを意味します。

私はおそらくこのようにして、ちょうど外側の$、(および)をエスケープします。

また、複数の一致が必要な場合は、find()を複数回呼び出す必要があります。これに対してwhileループを使用しました。

final String command = "somescript.file $(ABC_PATH1) $(ENV_PATH2) <may be other args too here>"; 
final String pattern = "\\$\\((\\w+)\\)"; 

final Pattern pr = Pattern.compile(pattern); 
final Matcher match = pr.matcher(command); 
while (match.find()) { 
    System.out.println("Found value: " + match.group(1)); 
} 

出力

Found value: ABC_PATH1 
Found value: ENV_PATH2 
+0

それは働いています。ありがとう、@アダム – CharanTej

1

Pattern.quote("Q$(w+)E")メソッドを使用すると、コンパイルメソッドで渡すパターンを追加できます。

final Pattern pr = Pattern.compile(Pattern.quote("Q$(w+)E")); 
+0

は、チェタン、ありがとうございました。しかし、私のために働いていないです。 – CharanTej

1

あなたは問題を複雑にしていると思います。

command.indexOf("$("); 

使用例:

public class Test 
{ 
    private static final String[] WORDS; 

    static { 
     WORDS = new String[] { 
      "WORD1", 
      "WORD2" 
     }; 
    } 

    public static void main(final String[] args) { 
     String command = "somescript.file $(ABC_PATH1) $(ENV_PATH2)"; 

     int index = 0; 
     int i = 0; 

     while (true) { 
     index = command.indexOf("$(", index); 

     if (index < 0) { 
      break; 
     } 

     command = command.replace(command.substring(index, command.indexOf(")", index) + 1), WORDS[i++]); 
     } 
    } 
} 

それは出力します。somescript.file WORD1 WORD2

元にこだわり$(以来
だけ出現があるかどうかを確認するためにこれを行うには、予約された "単語" でありますソース:

public class Test 
{ 
    public static void main(final String[] args) { 
     final String command = "somescript.file $(ABC_PATH1) $(ENV_PATH2)"; 
     int index = 0; 
     int occurrences = 0; 

     while (true) { 
     index = command.indexOf("$(", index); 

     if (index < 0) { 
      break; 
     } 

     occurrences++; 
     System.out.println(command.substring(index, command.indexOf(")", index++) + 1)); 
     } 

     if (occurrences < 1) { 
     System.out.println("No placeholders found"); 
     } 
    } 
} 
+0

返信いただきありがとうございますLppEdd。しかし、実際には、一致するパターンを環境変数に置き換えています。そして、私はその実装を変更したくないです(これは既に一致したパターンを置き換えるために処理されました) 私のリスト(コード内のWORDS)にあるすべての変数を解決した後、 $(XXX)が解決されました。 このようなもの: cmd = "somescript.file $(ABC_PATH1)$(ENV_PATH2)$(ENV3)"; $(ABC_PATH1)>>> "WORD1"、 $(ENV_PATH2)>>> "WORD2" $(ENV3)>>>何も利用できません。 – CharanTej

+0

こんにちは!私はあなたが何をしたいのかまだ分かりません。さまざまなプレースホルダを表示する必要がありますか? – LppEdd

+0

@CharanTej更新された回答を参照 – LppEdd

1

パターンは次のようになります。

public static void main(String[] args) { 
    final String command = "somescript.file $(ABC_PATH1) $(ENV_PATH2) <may be other args too here>"; 
    final String pattern = "\\$\\((.*?)\\)"; 
    // final String pattern1 = "\\Q$(ABC_PATH1)\\E"; 

    final Pattern pr = Pattern.compile(pattern); 
    final Matcher match = pr.matcher(command); 

    while (match.find()) { 
     System.out.println("Found value: " + match.group(1)); 
    } 

} 

プリント:

Found value: ABC_PATH1 
    Found value: ENV_PATH2 
+0

迅速な返信ありがとうございます。それは2つの引数のためだけに働いています。 しかし、以下の場合は動作していません。 final String command "somescript.file $(ABC_PATH1) $(ENV_PATH2) $(ENV_PATH3) "; CharanTej

+0

申し訳ありませんが、私の間違いでした。それは働いている。ありがとう、@ Krzysztof Cichocki – CharanTej

1

問題は、引用することは、\ Wに+パターンで適用されるということです私はそれがインテンションではないと思う(つまり、バックスラッシュ「w」とプラス記号を含む文字列「cmd $(\ w +)」と一致します)。

パターンに置き換えることができます:あなたはまだ最初の部分には、\ Qと\ Eを使用したい場合

final String pattern = "\\$\\(\\w+\\)"; 

または、:

final String pattern = "\\Q$(\\E\\w+\\)"; 
+0

それは働いています。ありがとう、シャイ。 – CharanTej