[英]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.