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
ではありませんが、これを使用して大幅に簡略化されたより複雑な操作でこれを追跡したい場合は、より単純なはずです。ストリーム。