使用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
(并!s.isEmpty()
在中使用filter
),因为这仅仅是为了正确分割类似的东西2-34
(这也可以使用regex in来处理split
,但这相当复杂)。
Arrays.stream
把我们String[]
变成一个Stream<String>
。
filter
删除开头和结尾的空字符串以及任何-
不属于数字的字符串。
mapToInt(Integer::parseInt).toArray()
呼吁parseInt
每个String
给我们一个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
如图所示其他的答案,但如果你想用更复杂的操作,这些操作与使用的显著简化跟进它应该是简单流。