Использование trim() в Java для удаления частей вывода

У меня есть код, который я написал, который выводит пакетный файл на 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();

            }

        }

    });

5 ответов

Вы также можете использовать 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();

Ну, я бы лично использовал функцию 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));

            }

Попробуйте использовать подстроку, чтобы отрубить части, которые вам не нужны, поэтому создайте новую строку

Вы можете использовать другое регулярное выражение и 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 = (мы используем группу, начинающуюся с ?: здесь, чтобы указать, что содержимое группы не должно сохраняться), тогда мы сопоставляем 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

Вариантов мало, проще всего тупее:

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, вы можете разделить его на '=' и сохранить в контейнере ключ / значение, например, HashMap или просто внутри списка.

Другие вопросы по тегам