2017-03-06 98 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

它正在工作。謝謝@Adam – CharanTej

1

您可以使用Pattern.quote("Q$(w+)E")方法在編譯方法中添加Pattern來傳遞。

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

感謝您的快速回復。它僅適用於兩個參數。 但是,對於下面,它不工作。 final String command "somescript.file $(ABC_PATH1) $(ENV_PATH2) $(ENV_PATH3) "; CharanTej

+0

對不起,這是我的錯。這是工作。謝謝你,@Krzysztof Cichocki – CharanTej

1

的問題是,引用適用於\ w +在模式以及我認爲這不是內部(因爲它是匹配包含反斜線,'w'和加號的字符串「cmd $(\ w +)」)。

模式可以被替換爲:

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

或者,如果你仍然想使用\ Q和\ E對第一部分:

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

它的工作。謝謝你,謝謝。 – CharanTej