เมื่อใช้ 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
ตามที่แสดงในคำตอบอื่น ๆ แต่ควรจะง่ายกว่านี้หากคุณต้องการติดตามสิ่งนี้ด้วยการดำเนินการที่ซับซ้อนมากขึ้นซึ่งจะง่ายขึ้นอย่างมากเมื่อใช้ สตรีม