繁体   English   中英

使用正则表达式按列拆分字符串

[英]Splitting String by column with regex

4 
1 1
1 2 1
0
1 1

这是我作为输入获得的字符串,但我只需要从第二列开始的每一列,也就是:

  • 1(第二行)
  • 2 和 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

您可以使用以下正则表达式:

(?<=\d )\d+

它匹配任何数字组合,后跟“数字+空格”。

您应该使用带有这个正则表达式的匹配器,而不是对此进行拆分。

此处查看演示。

首先修剪前导列,然后在空白处拆分:

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

这里还有一个测试正则表达式的链接:

https://regex101.com/r/z1plcG/1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM