2013-07-19 24 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]

相关问题