正则表达式用于提取信息

时间:2013-09-08 13:50:43

标签: java regex

我有一个csv文件,其中包含以下数据格式

123,"12.5","0.6","15/9/2012 12:11:19"

这些数字是:

  • 订单号
  • 折扣率
  • 销售日期和时间

我想从该行中提取这些数据。

我尝试过正则表达式:

String line = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
Pattern pattern = Pattern.compile("(\\W?),\"([\\d\\.\\-]?)\",\"([\\d\\.\\-]?)\",\"([\\W\\-\\:]?)\"");
Scanner scanner = new Scanner(line);
if(scanner.hasNext(pattern)) {
    ...
}else{
    // Alaways goes to here
}

看起来我的模式不正确,因为它总是进入else部分。我做错了什么?有人可以为此建议解决方案吗?

非常感谢。

5 个答案:

答案 0 :(得分:1)

看起来有点过于复杂到特定分割,你应该尝试通过元素之间最明显的常见分隔符进行分割,这是一个逗号。也许你应该尝试这样的事情:

    final String info = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
    final String[] split = info.split(",");
    final int orderNumber = Integer.parseInt(split[0]);
    final double price = Double.parseDouble(split[1].replace("\"", ""));
    final double discountRate = Double.parseDouble(split[2].replace("\"", ""));
    final String date = split[3].replace("\"", "");

答案 1 :(得分:1)

正则表达式对于此类工作非常麻烦。

我建议使用CSV库,例如OpenCSV

库可以将String条目解析为String数组,并且可以根据需要解析各个条目。这是针对特定问题的OpenCSV示例:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
   int orderNumber = Integer.parseInt(nextLine[0]);
   double price = Double.parseDouble(nextLine[1]);
   double discountRate = Double.parseDouble(nextLine[2]);
   ...
}

可以找到完整的文档和示例here

答案 2 :(得分:0)

正则表达式中的

?表示“零或一次出现”。您可能希望使用+代替(一个或多个),以便它可以捕获所有数字,点,冒号等。

答案 3 :(得分:0)

scanner.hasNext(pattern)

来自documentation

  

如果下一个完整标记与指定模式匹配,则返回true。

但下一个标记是123,"12.5","0.6","15/9/2012,因为扫描程序使用空格标记单词。

你的正则表达式也存在一些问题

  • 您使用?表示零或一个,您应该使用* - 零或更多,或+ - 一个或多个,
  • 您在开始时使用了\\W,但这也会排除数字。

如果您真的想使用扫描仪和正则表达式,请尝试使用

Pattern.compile("(\\d+),\"([^\"]+)\",\"([^\"]+)\",\"([^\"]+)\"");

并使用

将使用的分隔符更改为新的行标记
scanner.useDelimiter(System.lineSeparator());

答案 4 :(得分:0)

这可以解决您的问题:

    String line = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
    Pattern pattern = Pattern.compile("([0-9]+),\\\"([0-9.]+)\\\",\\\"([0-9.]+)\\\",\\\"([0-9/:\\s]+)\\\"");
    Scanner scanner = new Scanner(line);
    scanner.useDelimiter("\n");
    if(scanner.hasNext(pattern)) {
        MatchResult result = scanner.match();
        System.out.println("1st: " + result.group(1));
        System.out.println("2nd: " + result.group(2));
        System.out.println("3rd: " + result.group(3));
        System.out.println("4th: " + result.group(4));
    }else{
        System.out.println("There");
    }

请注意,?表示0或1次出现,同时+表示1次或更多次。

请注意使用0-9作为数字。如果您愿意,也可以使用\d。对于空格,您必须使用scanner.useDelimiter("\n")更改扫描仪的分隔符。

此代码段的输出为:

1st: 123
2nd: 12.5
3rd: 0.6
4th: 15/9/2012 12:11:19