0

以下の正規表現が失敗する理由を理解しようとしています。の両側で値の範囲を取得しようとしています:が、コードは常にelse. rangeこのようなコマンドライン引数から来てい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

4 に答える 4

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

于 2013-07-19T22:06:53.383 に答える
1

問題は、出力配列の処理です。String.split区切り文字を削除し、配列に含めません。あなたの番号は と にnumbers[0]なりnumbers[1]ます。numbers[2]例外をスローします。

于 2013-07-19T22:04:10.610 に答える
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;
}
于 2013-07-19T22:04:29.917 に答える
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]よろしいですか?

于 2013-07-19T22:10:32.550 に答える