[英]Splitting String by column with regex
4
1 1
1 2 1
0
1 1
這是我作為輸入獲得的字符串,但我只需要從第二列開始的每一列,也就是:
此String
在可能有多少行或多少列(列被一個空格分隔)方面沒有固定大小。
我認為這很容易通過使用:
string.split("enter regex here");
我需要第一列之后的每一列。 我仍在學習正則表達式,但我似乎無法找到一個好的解決方案。 我知道"\\r?\\n" and " "
用於拆分,但不知道如何連接兩者以獲得每一列。 非常感謝任何幫助:)
另一個字符串可能如下所示:
2
1
1 2
9 3 5
1 3
0 9 2 4
0
在這種情況下,我需要2, 3, 5, 3, 9, 2, 4
。
首先修剪前導列,然后在空白處拆分:
String[] split = str.replaceAll("(?m)^\\d+\\s*", "").split("\\s");
見現場演示。
替換使用多行標志(?m)
,這使得^
匹配每一行的開頭,並且\s
匹配空格,因此第一列被有效地從每一行中刪除,但\s
也匹配換行符,所以只有一個列被完全刪除。 盡管新行保留在超過 1 列的行中。
因為\s
匹配空格和換行符,所以在列之間和(刪除第一列)行之間進行拆分,從而產生所需的結果。
我相信這是解決方案所需的最少代碼。
您可以使用String.lines
拆分每一行以獲取行流,然后在使用Pattern.splitAsStream
在每個空間拆分后對這些行進行平面映射,並跳過第一列並使用逗號作為分隔符重新連接:
String input ="4 \n"
+ "1 1\n"
+ "1 2 1\n"
+ "0\n"
+ "1 1\n";
Pattern pattern = Pattern.compile(" ");
String result = input.lines()
.flatMap(line -> pattern.splitAsStream(line).skip(1))
.collect(Collectors.joining(", "));
System.out.println(result);
//1, 2, 1, 1
String s = "4 \n"
+ "1 1\n"
+ "1 2 1\n"
+ "0\n"
+ "1 1\n";
String result = s.replaceAll("((^|\\n)\\d|[ ])", "").replaceAll("(\\d)(?=\\d)", "$1, ");
System.out.println(result);
//1, 2, 1, 1
您可以使用以下正則表達式,它首先捕獲一個數字后跟一個空格,然后捕獲任何數字序列,后跟一個空格或什么都沒有。 第二個捕獲組代表您感興趣的String
的其余部分。
(\d+) ((\d+( |))+)
這是一個實現:
String str = "4 \n" +
"1 1\n" +
"1 2 1\n" +
"0\n" +
"1 1";
Pattern pattern = Pattern.compile("(\\d+) ((\\d+( |))+)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println(matcher.group(2));
}
這是測試上述兩個輸入的代碼的鏈接:
https://www.jdoodle.com/iembed/v0/s92
1
2 1
1
2
3 5
3
9 2 4
這里還有一個測試正則表達式的鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.