За допомогою 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
(це також може бути оброблено суто за допомогою регулярного вираження 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
як показано в інших відповідях, але це повинно бути простішим, якщо ви хочете виконати це за допомогою більш складних операцій, які значно спрощуються з використанням потоки.