Java 如何使用正则表达式解析字符串中的数字

Java 如何使用正则表达式解析字符串中的数字,java,regex,parsing,Java,Regex,Parsing,我试图理解为什么我下面的正则表达式失败了。我试图在:的两侧检索一系列值,但我的代码总是无法检索到的其他值range来自这样的命令行参数java-jarmyprogram.jar-r50:100 它失败是因为我将字符串传递给matches()并查找整数吗 这是我的密码: private int[] parseRangeResults(String range) { int[] rangeResults = new int[2]; if(range.matches("\\d+:\\d+

我试图理解为什么我下面的正则表达式失败了。我试图在
的两侧检索一系列值,但我的代码总是无法检索到
的其他值
range
来自这样的命令行参数
java-jarmyprogram.jar-r50: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;
}   

问题是如何处理输出数组
String.split
删除分隔符,不将其包含在数组中。您的号码将出现在
numbers[0]
numbers[1]
中<代码>数字[2]
将引发异常。

问题在于您对输出数组的处理
String.split
删除分隔符,不将其包含在数组中。您的号码将出现在
numbers[0]
numbers[1]
中<代码>数字[2]将引发异常。

我将这样编写它

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;
}
private static int[] parseRangeResults(String range) {
    String[] numbers = range.split(":", -2)
    return new int[] {Integer.parseInt(numbers[0]),Integer.parseInt(numbers[1])};
}
如果没有
它将给您一个
索引outofboundexception:1


如果有一个无效的数字,如
1abc:234
,您将得到
NumberFormatException:无法解析1abc

,我会这样写

private static int[] parseRangeResults(String range) {
    String[] numbers = range.split(":", -2)
    return new int[] {Integer.parseInt(numbers[0]),Integer.parseInt(numbers[1])};
}
如果没有
它将给您一个
索引outofboundexception:1

如果有一个像
1abc:234
这样的无效数字,您将得到
NumberFormatException:无法解析1abc

Regex
“\\d+:\\d+”
字符串
“asdf123:456qwerty”
将始终返回
true

改用那个正则表达式

"^\\d+:\\d+$"
或者使用异常

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

注:您确定字符串的
数字[2]

“\\d+:\\d+”“asdf123:456qwerty”将始终返回
true

改用那个正则表达式

"^\\d+:\\d+$"
或者使用异常

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



注:您确定编号[2]吗?

出于兴趣,为什么使用编号[2]而不是编号[1]?您的样本范围是什么?(例如,它与我的“123:123”匹配。)@JonSkeet我的错误是,我假设
被添加到字符串数组中。我从来没有到过代码的那一部分看到失败:-P@PeterLawrey我是个新手,所以我不怀疑你的判断,但我添加了它,以防有人通过arg,如
10a000:500000
。如果我把它拿出来,我如何验证传递的数据是正确的?@code4me请看我的示例。这将引发一个异常,如
java.lang.NummberFormatException:Unable to parse number 10a000
出于兴趣,为什么要使用
numbers[2]
而不是
numbers[1]
?(例如,它与我的“123:123”匹配。)@JonSkeet我的错误是,我假设
被添加到字符串数组中。我从来没有到过代码的那一部分看到失败:-P@PeterLawrey我是个新手,所以我不怀疑你的判断,但我添加了它,以防有人通过arg,如
10a000:500000
。如果我把它拿出来,我如何验证传递的数据是正确的?@code4me请看我的示例。这将引发一个异常,如
java.lang.NummberFormatException:无法解析数字10a000
这是我的问题,同时传递了我的函数错误数据:-/@code4me,在这里使用调试器或打印输入可能会有所帮助;)由于这种方法会抛出许多异常,在实践中,捕获它们的最佳方法是什么?我通常从导致异常的方法将异常抛出到自定义类。但我不知道如何以您编写的方式处理它。@code4me您应该只在知道要对异常执行什么操作时处理异常。i、 除非您知道,否则不要对异常执行任何操作。这是我的问题,也是传递我的函数错误数据的问题:-/@code4me,在这里使用调试器或打印输入可能会有所帮助;)由于这种方法会抛出许多异常,在实践中,捕获它们的最佳方法是什么?我通常从导致异常的方法将异常抛出到自定义类。但我不知道如何以您编写的方式处理它。@code4me您应该只在知道要对异常执行什么操作时处理异常。i、 除非你知道,否则不要做任何有例外的事情。