Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用regex-Java解析表_Java_Regex_String_Parsing - Fatal编程技术网

使用regex-Java解析表

使用regex-Java解析表,java,regex,string,parsing,Java,Regex,String,Parsing,我正在分析以下AWScost实例表: 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 有一个文件记录了这些成

我正在分析以下
AWS
cost实例表:

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']
要获得正确的结果,正确的
regex
是什么?我们可以假设表将始终具有相同的模式

试试这把小提琴

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

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


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

被一个或多个空格分割。空格必须出现在下面的上下文中

数字-空格-非“x”

非“x”-空格-数字

    values = line.split("(?<=\\d)\\s+(?=[^x])|(?<=[^x])\\s+(?=\\d)")));

values=line.split((?如果要使用正则表达式,请执行以下操作:

        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));

实际数据是否用制表符分隔?是否存在列仅由一个空格分隔的情况?@Pietu1998大多数情况下……但不一定……正则表达式会产生更强大的功能……这就是为什么我没有使用
\\t+
进行解析的原因。这些文件很大,因此搜索这些文件以修复缺失可能毫无意义你能用
\\s{2,}
?@PM77-1是的,但这给了我一个问题:
1.71x160美元每小时
换一种方式怎么样?按
\\s
分割,然后连接结果的一部分。还有一件事……
Java
正在抱怨
无效的转义序列
…我该如何解决?轰!谢谢much@Just再来一次ing…有些行只有
EBS$0.024
,所以它也应该与之匹配…在本例中,
['EBS Only','$0.024']
。我尝试添加它,但没有成功。。。
        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));