Java 拆分数字时将空字符串添加到字符串数组
我目前正试图使用codebat为大学复习Java。我的目标是获取任意ASCII字符的字符串,从字符串中拆分所有数字,然后将所有数字的总和作为int返回 例如:fooabc123xyz应返回123,foo12cd43ad应返回55 这是我的密码:Java 拆分数字时将空字符串添加到字符串数组,java,arrays,regex,split,Java,Arrays,Regex,Split,我目前正试图使用codebat为大学复习Java。我的目标是获取任意ASCII字符的字符串,从字符串中拆分所有数字,然后将所有数字的总和作为int返回 例如:fooabc123xyz应返回123,foo12cd43ad应返回55 这是我的密码: public int sumNumbers(String str) { int sum = 0; String[] numArr = str.split("\\D+"); //This is my attempted r
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;
}
运行sumNumbersabc123xyz或SUMNumbersa11b33时,会出现以下错误:
NumberFormatException:对于输入字符串:
为什么我的numArr中有一个空字符串,解决这个问题的合适正则表达式是什么?Matcher更适用于此,然后拆分:
int sum = 0;
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str);
while(m.find()) {
sum+=Integer.parseInt(m.group());
}
return sum;
您将在非数字上进行拆分,除非第一个字符是数字,否则您将得到一个空白字符串,因为根据java文档,这是正确的行为
您的函数在以数字作为第一个字符的字符串上运行良好。检查文档中的以下行: 当此字符串开头有正宽度匹配时 然后一个空的前导子字符串包含在 结果数组。开始时的零宽度匹配,但从不 生成这样的空前导子字符串 您可以通过打印生成的数组来确认它。空字符串无法解析为int。解决方法是忽略无法解析为int的字符串 输出:
126
52
可能需要过滤掉非数字序列拆分\\D+后的空值 此外,流API可用于计算和: 公共静态int sumnumberstring str{ 返回Arrays.streamstr.split\\D+//Stream .filters->!s.isEmpty//删除空字符串 .mapToIntInteger::parseInt//获取原语int的IntStream流 总和 } 测试: 输出:
126
52
类似地,匹配数字序列的模式-?\\d+包括可选-?要处理负值,可以使用以下方法:
公共静态int sumnumberstring str{
模式p=模式。编译-?\\d+;
返回p.matcherstr
.results//自Java 9以来的流
.mapMatchResult::group//将匹配的序列作为字符串获取
.mapToIntInteger::parseInt//获取基元int
总和
}
相同试验数据的结果:123-3和12+34-6
120
40
因为使用非数字作为分隔符进行拆分,并且此分隔符出现在字符串的开头。文档中也描述了此行为。简单修复:包装在if语句中:if!num.isEmpty{…}。
126
52
120
40