Используя 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
, как показано в других ответах, но это должно быть проще, если вы хотите выполнить более сложные операции, которые значительно упрощаются при использовании потоков.