0

我试图理解为什么我下面的正则表达式失败了。我试图在两侧检索一系列值,:但我的代码总是失败elserange来自这样的命令行参数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 回答