Использование 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 или просто внутри списка.