从命令行读取时,空元素插入到ArrayList中

时间:2015-04-17 16:21:48

标签: java regex arraylist string-parsing

我有一些代码,我正在运行以使用以下代码从给定用户的命令行获取用户组列表:

private ArrayList<String> accessGroups = new ArrayList<String>();

public void setAccessGroups(String userName) {
    try {
        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec("/* code to get users */");

        BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

        String line = null;

        // This code needs some work
        while ((line = input.readLine()) != null){  
            System.out.println("#" + line);
            String[] temp;
            temp = line.split("\\s+");
            if(line.contains("GRPNAME-")) { 
                for(int i = 0; i < temp.length; i++){
                    accessGroups.add(temp[i]);
                }
            }
        }
        // For debugging purposes, to delete
        System.out.println(accessGroups);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

获取用户的代码返回包含以下内容的结果:

#Local Group Memberships      *localgroup1          *localgroup2      
#Global Group memberships     *group1               *group2    
#                             *group3               *group4       
#                             *GRPNAME-1            *GRPNAME-2             

该代码旨在提取以GRPNAME-开头的任何内容。这很好用,就像我打印ArrayList我得到的那样:

[, *GRPNAME-1, *GRPNAME-2]

引用了一串""。有没有一种简单的方法可以改变正则表达式,或者另一种解决方案,我可以尝试在添加时删除它。

预期输出为:

[*GRPNAME-1, *GRPNAME-2]

编辑:已回答,已编辑的输出以反映代码中的更改。

2 个答案:

答案 0 :(得分:2)

而不是此代码段中提供的此标记:

line.split("\\s+");

使用模式匹配\S+并将其添加到您的收藏中。例如:

// Class level
private static final Pattern TOKEN = Pattern.compile("\\S+");

// Instance level
{
    Matcher tokens = TOKEN.matcher(line);
    while (tokens.find())
        accessGroups.add(tokens.group());
}

答案 1 :(得分:0)

最后简单回答,代替:

temp = line.split("\\s+");

使用:

temp = line.trim().split("\\s+");