我写了一些代码,用于将批处理文件输出输出到jTextArea。目前批处理文件输出计算机名称的活动目录查询,但是有一些东西也输出,我想从变量String trimmedLine的输出中删除。目前它仍在输出其他所有内容,我无法弄清楚如何只显示计算机名称。
输出:“CN = FDCD111304,OU =工作站,OU = SIM,OU =帐户,DC = FL,DC = NET”
我希望输出只显示:
FDCD111304
有谁能告诉我如何修复我的代码只输出计算机名称而没有别的? 查看控制台输出(忽略控制台输出中的顶行)
btnPingComputer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String line;
BufferedWriter bw = null;
BufferedWriter writer =null;
try {
writer = new BufferedWriter(new FileWriter(tempFile));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String lineToRemove = "OU=Workstations";
String s = null;
Process p = null;
try {
p = Runtime.getRuntime().exec("c:\\computerQuery.bat");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StringBuffer sbuffer = new StringBuffer(); // new trial
BufferedReader in = new BufferedReader(new InputStreamReader(p
.getInputStream()));
try {
while ((line = in.readLine()) != null) {
System.out.println(line);
textArea.append(line);
textArea.append(String.format(" %s%n", line));
sbuffer.append(line + "\n");
s = sbuffer.toString();
String trimmedLine = line.trim();
if(trimmedLine.equals(lineToRemove)) continue;
writer.write(line + System.getProperty("line.separator"));
}
fw.write("commandResult is " + s);
String input = "CN=FDCD511304,OU=Workstations,OU=SIM,OU=Accounts,DC=FL,DC=NET";
Pattern pattern = Pattern.compile("(.*?)\\=(.*?)\\,");
Matcher m = pattern.matcher(input);
while(m.find()) {
String currentVar = m.group().substring(3, m.group().length() - 1);
System.out.println(currentVar); //store or do whatever you want
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally
{
try {
fw.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
答案 0 :(得分:1)
在处理专有名称时,您也可以使用javax.naming.ldap.LdapName
。它还处理转义,单独使用正则表达式就很棘手(例如cn = foo \,bar,dc = fl,dc = net是一个完全有效的DN)
String dn = "CN=FDCD111304,OU=Workstations,OU=SIM,OU=Accounts,DC=FL,DC=NET";
LdapName ldapName = new LdapName(dn);
String commonName = (String) ldapName.getRdn(ldapName.size() - 1).getValue();
答案 1 :(得分:0)
好吧,我个人会使用split()函数来首先拆分部件,然后再解析出来。所以我的(可能是非专业和错误的代码)将是
String args[] = line.split(",");
String args2[] = args[0].split("=");
String computerName = args2[1];
这就是这个地方:
while ((line = in.readLine()) != null) {
System.out.println(line);
String trimmedLine = line.trim();
if (trimmedLine.equals(lineToRemove))
continue;
writer.write(line
+ System.getProperty("line.separator"));
textArea.append(trimmedLine);
textArea.append(String.format(" %s%n", line));
}
答案 2 :(得分:0)
您可以使用其他正则表达式Matcher.matches()
来查找您要查找的值:
String str = "CN=FDCD111304,OU=Workstations,OU=SIM,OU=Accounts,DC=FL,DC=NET";
Pattern pattern = Pattern.compile("(?:.*,)?CN=([^,]+).*");
Matcher matcher = pattern.matcher(str);
if(matcher.matches()) {
System.out.println(matcher.group(1));
} else {
System.out.println("No value for CN found");
}
FDCD111304
该正则表达式将找到CN的值,无论字符串在何处。第一组是丢弃 CN = 前面的任何内容(我们在这里使用以?:
开头的组来表示不应该保留该组的内容),然后我们匹配< em> CN = ,然后是值,可能不包含逗号,然后是字符串的其余部分(我们不关心)。
您还可以使用其他正则表达式和Matcher.find()
来获取键和值,并选择要处理的键:
String str = "CN=FDCD111304,OU=Workstations,OU=SIM,OU=Accounts,DC=FL,DC=NET";
Pattern pattern = Pattern.compile("([^=]+)=([^,]+),?");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String key = matcher.group(1);
String value = matcher.group(2);
if("CN".equals(key) || "DC".equals(key)) {
System.out.printf("%s: %s%n", key, value);
}
}
CN:FDCD111304
DC:FL
DC:NET
答案 3 :(得分:0)
尝试使用子字符串来切断您不需要的部分,从而创建一个新的字符串
答案 4 :(得分:-1)
有几个选项,简单的最简单:
str.substring(str.indexOf("=") + 1, str.indexOf(","))
第二种更灵活的方法是构建HashArray,将来阅读其他值会很有帮助。
编辑:第二种方法
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.HashMap;
public class HelloWorld{
public static void main(String []args){
String input = "CN=FDCD111304,OU=Workstations,OU=SIM,OU=Accounts,DC=FL,DC=NET";
Pattern pattern = Pattern.compile("(.*?)\\=(.*?)\\,");
Matcher m = pattern.matcher(input);
while(m.find()) {
String currentVar = m.group().substring(0, m.group().length() - 2);
System.out.println(currentVar); //store or do whatever you want
}
}
}
这个将打印所有值,如CN = FDCD11130,您可以将其拆分为&#39; =&#39;并存储在像HashMap这样的键/值容器中,或者只存储在列表中。