Java-如何拆分基于列的字符串?

Java-如何拆分基于列的字符串?,java,regex,string,split,Java,Regex,String,Split,我在一个文件中有以下两行: 16.114.3 8.87.0 7.85 13.29 18.75 13.08 13.10 6.75.46.39 我可以使用“\\s+”正则表达式拆分第一行。但我不能分开第二排。 我希望以这样的方式拆分上述字符串,以获得以下输出: row[1] = [16.1, 14.3, 8.8, 7.0, 7.85, 13.29, 18.75, 13.08, 13.10] row[2] = [6.7, 5.4, null, null, 6.39, null, null, null,

我在一个文件中有以下两行:

16.114.3 8.87.0 7.85 13.29 18.75 13.08 13.10

6.75.46.39

我可以使用“\\s+”正则表达式拆分第一行。但我不能分开第二排。 我希望以这样的方式拆分上述字符串,以获得以下输出:

row[1] = [16.1, 14.3, 8.8, 7.0, 7.85, 13.29, 18.75, 13.08, 13.10]
row[2] = [6.7, 5.4, null, null, 6.39, null, null, null, null]
下面是我必须解析的内容的屏幕截图:


对我来说,这似乎是一个固定宽度的文件

请尝试下面的正则表达式

.{7}
可以根据列的宽度更改大括号内的值

.{column_width_goes_here}
样品

您可以使用流,然后拆分行和单元格,从而生成列表列表:

List<List<String>> matrix = Arrays.asList(text.split("\n"))
            .stream()
            .map(line -> Arrays.asList(line.split("\\s+")))
            .collect(Collectors.toList())
这将产生:

[[16.1, 14.3, 8.8, 7.0, 7.85, 13.29, 18.75, 13.08, 13.10], [, 6.7, 5.4, 6.39]]

似乎您的输入在第一个数字的开始和下一个数字的开始之间有一个固定的长度(7):

16.1   14.3    8.8    7.0    7.85  13.29  18.75  13.08   13.10
^^^^^^^--------(7)
在这种情况下,您可以使用此正则表达式拆分输入(?使用
String[]行={
"16.1   14.3    8.8    7.0    7.85  13.29  18.75  13.08   13.10",
"6.7    5.4                   6.39                             "
};
拆分器拆分器=拆分器固定长度(7);
用于(字符串行:行){
列表数据=拆分器。拆分列表(行);
对于(int i=0;i
不确定刚才的编辑是否是一个好主意,因为它确实改变了输入的格式。它现在有一个定义的空格数,与以前没有的一样。原始海报能否确认条目之间的空格数是否符合某个定义?也许需要进一步说明,文件将如何定义好的,如果我们将第一行的
18.75
替换为
23132.3312
?这可能吗?简单地说:当没有定义文件的外观时,就没有办法解析它。
“\\\s+”
不是有效的正则表达式。它应该是
“\\s+”
这似乎有效:单个数字的最大长度是多少?如果它可以增长到两个数字之间的距离以上,您将无法使用正则表达式进行拆分。您确定OP的
text2
中有这些尾随空格吗?@revo,是的,它有尾随空格。@PranitMore您必须在问题中提到这一点e、 revo的评论是一个很好的观点谢谢YCF_L!这个解决方案很有效。非常感谢!很抱歉这是我的错误。我以前应该提到尾随空格。你能解释一下这个正则表达式吗
(?@PranitMore将字符串拆分为特定长度是一个技巧,以了解更多信息请查看此答案此解决方案不符合我的标准,因为我在解决方案中也需要空列。
16.1   14.3    8.8    7.0    7.85  13.29  18.75  13.08   13.10
^^^^^^^--------(7)
String text1 = "16.1   14.3    8.8    7.0    7.85  13.29  18.75  13.08   13.10";
String text2 = "6.7    5.4                   6.39                             ";

String[] split1 = text1.split("(?<=\\G.{7})");
String[] split2 = text2.split("(?<=\\G.{7})");
[16.1   , 14.3   ,  8.8   ,  7.0   ,  7.85  , 13.29  , 18.75  , 13.08  ,  13.10]
[6.7    , 5.4    ,        ,        ,  6.39  ,        ,        ,        ,       ]
List<String> result = Arrays.asList(text2.split("(?<=\\G.{7})"))
        .stream()
        .map(input -> input.matches("\\s*") ? null : input.trim())
        .collect(toList());
[16.1, 14.3, 8.8, 7.0, 7.85, 13.29, 18.75, 13.08, 13.10]
[6.7, 5.4, null, null, 6.39, null, null, null, null]
String[] rows = {
    "16.1   14.3    8.8    7.0    7.85  13.29  18.75  13.08   13.10",
    "6.7    5.4                   6.39                             "
  };
Splitter splitter = Splitter.fixedLength(7);
for(String row: rows) {
  List<String> data = splitter.splitToList(row);
  for (int i = 0; i < data.size(); i++) {
    System.out.printf("Column %d: %s%n", i+1, data.get(i));
  }
}