这个问题在这里已经有答案了:
如何防止java.lang.string.split()创建前导空字符串(9个答案)
上个月关门了。
我现在正试图用codebat为大学复习java。我的目标是获取一个包含任意ascii字符的字符串,从该字符串中拆分所有数字,然后将所有数字的和作为int返回。
例如: foo("123xyz")
应该返回123和 foo("12cd43ad")
应该返回55
这是我的密码:
public int sumNumbers(String str) {
int sum = 0;
String[] numArr = str.split("\\D+"); //This is my attempted regex
for (String num: numArr) {
sum += Integer.parseInt(num);
}
return sum;
}
当我跑的时候 sumNumbers("123xyz")
或者 sumNumbers("aa11b33")
,我得到这个错误: NumberFormatException: For input string: ""
为什么在我的numar中有一个空字符串,什么是合适的正则表达式来解决这个问题?
4条答案
按热度按时间zed5wv101#
检查以下文件中的行
String#split
:如果此字符串的开头有正宽度匹配,则结果数组的开头将包含一个空的前导子字符串。但是,开头的零宽度匹配永远不会产生这样的空前导子串。
您可以通过打印结果数组来确认它。空字符串不能解析为
int
. 解决方法是忽略无法解析为int
.输出:
mklgxw1f2#
可能需要在
split("\\D+")
通过非数字序列。此外,流api可用于计算和:
测试:
输出:
类似地,一种匹配数字序列的模式
"-?\\d+"
(含选配)-?
为了处理负值),可以使用:相同试验数据的结果:(123-3)和(12+34-6)
vaqhlq813#
您将在非数字上进行拆分,除非第一个字符是数字,否则您将得到一个空字符串,因为根据javadoc,这是正确的行为https://docs.oracle.com/javase/8/docs/api/java/lang/string.html#split-java.lang.string-int文件-
函数在以数字作为第一个字符的字符串上运行良好。
svujldwt4#
matcher更适用于此目的,然后拆分: