我正在解析以下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
,以获得正确的结果?可以假设该表将始终具有相同的模式.
试试这个小提琴 https://regex101.com/r/sP6zW5/1
([^\s]+)\s+(\d+)\s+(\d+)\s+([\d\.]+)\s+(\d+ x \d+)\s+(\$\d+\.\d+)\s+(per \w+)
匹配文本,组是您的列表.
我认为在你的情况下使用拆分太复杂了.如果文本总是相同的.就像字符串格式的反向过程.
如果要使用正则表达式,请执行以下操作:
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));