当前位置:  开发笔记 > 编程语言 > 正文

使用正则表达式解析表 - Java

如何解决《使用正则表达式解析表-Java》经验,为你挑选了2个好方法。

我正在解析以下AWS成本实例表:

m1.small    1   1   1.7     1 x 160    $0.044 per Hour
m1.medium   1   2   3.75    1 x 410    $0.087 per Hour
m1.large    2   4   7.5     2 x 420    $0.175 per Hour
m1.xlarge   4   8   15      4 x 420    $0.35 per Hour

有一个包含这些费用的文件:

input = new Scanner(file);
String[] values;
while (input.hasNextLine()) {
    String line = input.nextLine();
    values = line.split("\\s+"); // <-- not what I want...
    for (String v : values)
        System.out.println(v);
}

然而,这给了我:

m1.small
1
1
1.7
1
x
160
$0.044
per
Hour

这不是我想要的...纠正解析values(使用正确的正则表达式)将如下所示:

['m1.small', '1', '1', '1.7', '1 x 160', '$0.044', 'per Hour']

什么是正确的regex,以获得正确的结果?可以假设该表将始终具有相同的模式.



1> amow..:

试试这个小提琴 https://regex101.com/r/sP6zW5/1

([^\s]+)\s+(\d+)\s+(\d+)\s+([\d\.]+)\s+(\d+ x \d+)\s+(\$\d+\.\d+)\s+(per \w+)

匹配文本,组是您的列表.

我认为在你的情况下使用拆分太复杂了.如果文本总是相同的.就像字符串格式的反向过程.



2> Jeanne Boyar..:

如果要使用正则表达式,请执行以下操作:

        String s = "m1.small    1   1   1.7     1 x 160    $0.044 per Hour";
        String spaces = "\\s+";
        String type = "(.*?)";
        String intNumber = "(\\d+)";
        String doubleNumber = "([0-9.]+)";
        String dollarNumber = "([$0-9.]+)";
        String aXb = "(\\d+ x \\d+)";
        String rest = "(.*)";

        Pattern pattern = Pattern.compile(type + spaces + intNumber + spaces + intNumber + spaces + doubleNumber
                + spaces + aXb + spaces + dollarNumber + spaces + rest);
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()) {
            String[] fields = new String[] { matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4),
                    matcher.group(5), matcher.group(6), matcher.group(7) };
            System.out.println(Arrays.toString(fields));
        }

注意我如何分解正则表达式以使其可读。(作为一个长字符串,很难读取/维护。)不过,还有另一种方法。由于您知道要拆分的字段,因此可以执行此简单拆分并使用合并后的值构建一个新数组:

        String[] allFields = s.split("\\s+");
        String[] result = new String[] { 
            allFields[0], 
            allFields[1],
            allFields[2],
            allFields[3],
            allFields[4] + " " + allFields[5] + " " + allFields[6],         
            allFields[7], 
            allFields[8] + " " + allFields[9] };
        System.out.println(Arrays.toString(result));

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有