使用 Java 8,您可以:
String str = "There 0 are 1 some -2-34 -numbers 567 here 890 .";
int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+"))
.filter(s -> !s.matches("-?"))
.mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]
如果你没有负数,你可以去掉replaceAll(并在filter中使用!s.isEmpty()),因为这只是为了正确拆分2-34之类的东西(这也可以处理纯粹使用split 中的正则表达式,但它相当复杂)。
Arrays.stream 将我们的String[] 变成Stream<String>。
filter 去掉了前导和尾随的空字符串以及任何不属于数字的-。
mapToInt(Integer::parseInt).toArray() 在每个String 上调用parseInt 给我们一个int[]。
另外,Java 9 有一个 Matcher.results 方法,它应该允许类似:
Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 .");
int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]
就目前而言,与仅使用 Pattern / Matcher 循环遍历结果相比,这些都不是一个很大的改进,如其他答案所示,但如果您想用更复杂的方法跟进它应该更简单使用流大大简化了操作。