在Java中使用trim()删除部分输出

时间:2015-06-09 23:20:04

标签: java bufferedreader trim

我写了一些代码,用于将批处理文件输出输出到jTextArea。目前批处理文件输出计算机名称的活动目录查询,但是有一些东西也输出,我想从变量String trimmedLine的输出中删除。目前它仍在输出其他所有内容,我无法弄清楚如何只显示计算机名称。

输出:“CN = FDCD111304,OU =工作站,OU = SIM,OU =帐户,DC = FL,DC = NET”

我希望输出只显示:

FDCD111304

有谁能告诉我如何修复我的代码只输出计算机名称而没有别的? 查看控制台输出(忽略控制台输出中的顶行) Look at console output

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

            }

        }

    });

5 个答案:

答案 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这样的键/值容器中,或者只存储在列表中。