我有一些代码,我正在运行以使用以下代码从给定用户的命令行获取用户组列表:
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]
编辑:已回答,已编辑的输出以反映代码中的更改。
答案 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+");