Java 拆分数字时将空字符串添加到字符串数组

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

我目前正试图使用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 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