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、 除非你知道,否则不要做任何有例外的事情。