【问题标题】:Regex to read specific file format in Java正则表达式读取 Java 中的特定文件格式
【发布时间】:2013-10-17 19:23:35
【问题描述】:

我需要读取这种格式的文件:

(w,x,y,z),(w,x,y,z), ... ,(w,x,y,z);

全部在一条线上。

//编辑:

我最终也需要对以下文件执行此操作:

(w,x,y,z_1 ... z_n),(w,x,y,z_1 ... z_n), ... ,(w,x,y,z_1 ... z_n);

所以简单地阅读过去的 3 个逗号并不能减少它。

我的计划是使用 Scanner 类将整个文件读入字符串,然后将其拆分为 (w,x,y,z) 部分的数组,然后将其拆分为实际的 w、x、y和z。最终,文件中的数据最终会出现在一个对象列表中,例如:

public class DataBean {
    private String w, x, y, z;
    ...
}

不过,我很难为此想出一个正则表达式。 我试过了

String[] allSystems = scanner.nextLine ( ).split ( "),(" );

当然,它切断了字符串,但我觉得这不是最优雅的解决方案。如果有人有更好的主意,我很想听听!

【问题讨论】:

  • 坦率地说,我认为您不会找到比这更优雅的解决方案。优雅!=花哨。 String[] allSystems = scanner.nextLine ( ).split ( "),(" ); 是一种非常干净的方法

标签: java regex file io split


【解决方案1】:

你可以试试:

String[] allSystems = scanner.nextLine ( ).split ( "(?<=\\)),(?<!\\()" );

你会得到(w,x,y,z)(w,x,y,z)(w,x,y,z);

接下来,获取wxyz,你可以这样做:

String system = "(w,x,y,z);";

String[] data = system.replaceAll("\\(|\\);?", "").split(",");

【讨论】:

    【解决方案2】:

    如果您使用line.split("(^\\(|\\),\\(|\\);|,)"),那么您将获得一个字符串数组,其中每个 w、x、y 和 z 作为数组中自己的元素。数组中的第一项将是一个空字符串,但如果您从索引 1 开始,您可以轻松地使用它来构造您的 DataBean 对象:

    String[] data = line.split("(^\\(|\\),\\(|\\);|,)");
    
    List<DataBean> dataBeans = new ArrayList<DataBean>();
    for (int i = 1; i < data.length; i += 4) {
        dataBeans.add(new DataBean(data[i], data[i+1], data[i+2], data[i+3]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多