2013-07-19 57 views
0

我想了解爲什麼我的正則表達式失敗。我試圖在:的兩側檢索一系列值,但我的代碼始終未能通過elserange來自命令行arg,如java -jar myprogram.jar -R 50:100如何使用正則表達式從字符串解析數字

它是否失敗,因爲我傳遞一個字符串到matches()並尋找整數?

這裏是我的代碼:

private int[] parseRangeResults(String range) { 
    int[] rangeResults = new int[2]; 

    if(range.matches("\\d+:\\d+")) { 

     String[] numbers = range.split(":") 
     rangeResults[0] = Integer.parseInt(numbers[0]); 
     rangeResults[1] = Integer.parseInt(numbers[1]); 
    } else { 
     throw new Exception("Invalid Syntax."); 
    } 
    return rangeResults; 
} 
+4

爲什麼使用'numbers [2]'而不是'numbers [1]',出於興趣? –

+0

你的樣品'範圍'是什麼? (例如,它匹配我的「123:123」。) –

+0

@JonSkeet我的錯誤,我認爲':'被添加到字符串數組中。我從來沒有看到代碼的那部分看到失敗:-P –

回答

2

我會寫這樣

private static int[] parseRangeResults(String range) { 
    String[] numbers = range.split(":", -2) 
    return new int[] {Integer.parseInt(numbers[0]),Integer.parseInt(numbers[1])}; 
} 

如果沒有:它會給你一個IndexOutOfBoundException: 1

如果有喜歡1abc:234無效的數字,你會得到NumberFormatException: Unable to parse 1abc

+1

這是我的問題,並傳遞我的功能壞數據。 : -/ –

+0

@code4me這就是使用調試器或打印輸入的地方有用的地方;) –

+0

由於這種方式會拋出一些例外,實際上,捕捉它們的最佳方式是什麼?我通常會將異常從導致異常的方法中拋出到自定義類中。但我不確定如何處理它按照你寫的方式。 –

1

的問題是,你的輸出數組處理。 String.split刪除分隔符並且不包含它在數組中。你的號碼將在numbers[0]numbers[1]numbers[2]會拋出異常。

1
private int[] parseRangeResults(String range) { 
    int[] rangeResults = new int[2]; 
    if(range.matches("\\d+:\\d+")) { 
     String[] numbers = range.split(":") 
     rangeResults[0] = Integer.parseInt(numbers[0]); 
     rangeResults[1] = Integer.parseInt(numbers[1]); 
    } else { 
     throw new Exception("Invalid Syntax."); 
    } 
    return rangeResults; 
} 
1

正則表達式"\\d+:\\d+"對於字符串"asdf123:456qwerty"將始終返回true

使用該正則表達式,而不是

"^\\d+:\\d+$" 

或者使用異常

try{ 
    Integer.parseInt("asdf"); 
}catch(NumberFormatException e){ 
    throw ...; 
} 

而且

try{ 
    String s1 = p[0]; 
    String s2 = p[1]; 
}catch(ArrayIndexOutOfBoundsException e){ 
    throw ...; 
} 

PS。你確定numbers[2]

相關問題