2016-03-27 66 views
1

我知道有很多在那裏。但我無法弄清楚如何從Scanner(System.in);正則表達式來提取命令行參數 - Java的

commandline = scanner.readLine(); 

兩個參數允許提取兩個參數:

第一個可以是AHG或4到9之間的數字之一。 第二個參數再次在4到9之間或任意數字。 應該處理所有的場景:

"  A 3 " //spaces before and after 
    "A 3"   // spaces between the params 
    "A 7  6" // Unwanted 3rd parameter 
    " 6 "   // Only one param with spaces. 

那麼如何寫正則表達式此提取上面? 我試過這個。 \\w\\s。但是這不起作用。我與RegEx很差。

回答

2

嘗試:

public static ArrayList<String> parseArguments(String argument){ 
    Pattern regex = Pattern.compile("^\\s*([AHG4-9])\\s*(\\d)?\\s*$", 
      Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 

    Matcher regexMatcher = regex.matcher(argument); 

    if (regexMatcher.find()) { 

     ArrayList<String> arguments = new ArrayList<String>(); 

     arguments.add(regexMatcher.group(1)); 

     if(regexMatcher.group(2) != null) 
     { 
      arguments.add(regexMatcher.group(2)); 
     } 

     return arguments; 
    } 

    return null; 

} 

根據您輸入:

它會打印:

[A,3] 

上面的正則表達式也強制實參規則。例如您提到的第一個參數可以是A,H,G或4到9之間的數字。第二個參數可以是任意數字,也可以是可選的

+0

我認爲你試圖用一個陳述來完成太多事情。這會讓你的代碼難以理解。 –

+0

我不確定你的難點是什麼,但不僅嘗試解析參數,而且還按照OP規則進行驗證。 – Saleem

+0

正在使用的正則表達式對於大多數不經常使用複雜正則表達式的程序員來說可能很難理解。因此,我寧願先分割輸入,然後在第二步中驗證參數。 –

3

readLine()返回的字符串使用此:

String [] arguments = commandLine.split("\\s+"); 

\\s+代表至少一個空白字符作爲分隔符。

然後檢查數組有多少個元素。

Fimally檢查兩個參數的格式

  1. arguments[0].matches("\\s*[AHG4-9]");
  2. arguments[1].matches("\\d");
+0

如何忽略空白並僅提取參數? –

+1

@KevinRave:這就是'commandLine.split(「\\ s +」);'應該做的。 –