我想取一個字串并隔離其中的所有整數,然后將它們存盤在一個陣列中。
輸入字串將只包含字母 az(大寫和小寫)、數字 0-9 和“-”(讀作減號)。
到目前為止,我已經寫了:
String str = readString();
String[] arr = str.split("[^0-9-] ");
如果我的輸入字串是例如“15abc-59abc31abc100”,上面的代碼作業正常,我只需要將字串陣列中的每個元素轉換為int,但是如果我的輸入字串在數字之間沒有字母來分隔它們,則不會好好作業。示例:abc59-12abc56-10abc10 將生成一個只有 3 個元素的陣列:59-12, 56-10, 10 如何讓它將減號識別為陣列中新元素的開始而不丟失符號本身?
理想情況下,我希望輸入“abc59-12abc56-10abc10”在拆分后看起來像這樣:
String[] arr = {"59","-12","56","-10","10");
讀取字串();方法將始終提供我上面描述的字串型別順便說一句。
uj5u.com熱心網友回復:
您真正想要的是這- 是一個有效的“數字符號”,但僅限于任何給定數字塊的開頭。
但是,通過嘗試匹配它們之間的負空間,您已經使自己變得困難:就正則運算式而言,這很棘手。
但是,如果你走的是積極的路線(寫一個描述數字的正則運算式),那將是微不足道的:Pattern.compile("-?\\d ")完美地描述它:一個可選的減號,后跟 1 個或多個數字。足夠簡單。如果您的輸入是“aa----5”,它有一個匹配序列 (-5),那它甚至可以“作業”。
那么..那就這樣做吧。你在split這里虐待。不要濫用系統,一旦你讓事情變得更復雜一點,它就會變得很糟糕。
private static final Pattern NUMBER = Pattern.compile("-?\\d ");
public List<Integer> getNumbers(String in) {
Matcher m = NUMBER.matcher(in);
var out = new ArrayList<Integer>();
while (m.find()) out.add(Integer.parseInt(m.group(0)));
return out;
}
這里使用了一些技巧:
m.find()在輸入字串中查找與提供的正則運算式匹配的下一個子序列。- 默認情況下,正則運算式是“貪婪的”。意思是,字串“1234”可以在許多方面合法地解釋:這是單個專案(1234)嗎?畢竟,只是'1' 也匹配“-?\d ”。“貪婪”意味著正則運算式將匹配最長的序列。毫無疑問,這正是您想要的。
m.group(0)讓你比賽。0 是一個特殊的組,包括整個找到的序列。如果您在正則運算式中使用括號,則可以創建組,并且您也可以獲得這些組,例如,如果您想排除您可以完成的減號"-?(\\d )"- 請注意括號。現在你可以了m.group(1)。- 請注意,如果您必須有 ,則將
int[]整數串列轉換為int[]需要回圈。toArray不能這樣做(Integer不是int,但List<int>目前是非法的 Java)。
uj5u.com熱心網友回復:
這是一個單行:剝離前導和尾隨非數字,然后在非數字/減號上拆分,轉換為int然后收集到陣列:
int[] numbers = Arrays.stream(str.replaceAll("^\\D |\\D $", "").split("(?=-\\d)|[^-\\d] "))
.mapToInt(Integer::parseInt).toArray();
這里的關鍵是拆分,當以下字符是減號然后是數字時,或者在既不是減號也不是數字的字符上時,它會執行零寬度的吐出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/337485.html
上一篇:從動態嵌套陣列生成物件的平面陣列
