2017-03-28 3 views
0

ich eine CSV-Datei in meine IDE lesen will ich haben, und die Werte sind im Format:ein bestimmtes Muster von Strings entfernen

Boston (MA), New York City (NY, CT, NJ) 
New York City (NY, CT, NJ), Philadelphia (PA, NJ) 
... 

ich in die Zeile gelesen werden und teilen Sie die Zeichenfolge an die Komma, ein Array von Zeichenfolgen erstellen, aber ich möchte nur die Städtenamen

Ich möchte alles entfernen, die Klammern um es herum hat. Kann ich das irgendwie?

+0

Java regex kann eventuell verschachtelte Klammern nicht verarbeiten. Da Klammern jedoch nicht geschachtelt sind, ist es möglich, die Zeichenfolge für Komma zu trennen. –

Antwort

1

Mit dem find() Methode können Sie dieses Muster verwenden:

[^(,]*(?:\\([^)]*\\)[^(,]*)* 

demo

1

Sie können etwas tun ein mit Regular Expression:

String fileLineString = "Boston (MA), New York City (NY, CT, NJ)"; 

final Pattern REMOVE_BRACKETED = Pattern.compile("\\(.+?\\)"); 
Matcher matcher = REMOVE_BRACKETED.matcher(fileLineString); 
String res = matcher.replaceAll("").replaceAll(" , ", ",").trim(); 
String[] cities = res.split(","); 

//Display the cities Array in Console... 
for (int i = 0; i < cities.length; i++) { 
    System.out.println(cities[i]); 
} 

Die Konsolenausgabe wird:

Boston 
New York City 

Das zu verwendende RegEx-Muster sucht grundsätzlich nach allen offenen Klammern \\( zusammen mit einem oder mehreren Zeichen (außer Newline), unabhängig davon, wie viele .+? bis zu den schließenden Klammern \\) gefunden werden.

Wir führen dann dieses Muster durch die Matcher.matcher() Methode.

Wir erklären dann eine String-Variable (namens res) und initialisieren es mit dem zurückgegebenen String aus dem Matcher.replaceAll() Methode, die jede Untersequenz der Eingangssequenz ersetzt, die das Muster mit dem angegebenen übereinstimmt Ersetzungszeichenfolge verwenden wir "" innerhalb der Methode, um anzuzeigen, dass wir ersetzen möchten, was übereinstimmte. Wir wenden dann die String.replaceAll() Methode (wie in: .replaceAll(" , ", ",")) an, um die unerwünschten Leerzeichen vor und nach den Trennzeichen zu bereinigen, und schließlich wenden wir die String.trim() an, um alle führenden oder nachfolgenden zu entfernen Leerzeichen aus der gesamten Ergebniszeichenfolge sollten vorhanden sein.

Jetzt erstellen wir einfach ein String Array Städte mit dem String.split() Methode genannt. Den Rest des Codes bin ich mir ziemlich sicher, dass du es herausfinden kannst.

UPDATE:

Ganz einfach, weil diese Art von nervte mich ein bisschen ...

Der obige Code ausreichend für Strings arbeitet, die Klammern enthalten, die nicht verschachtelt sind, aber nicht, wenn es Klammern verschachtelt sind. Wenn Sie feststellen, dass Ihre Strings von Zeit zu Zeit verschachtelte Klammern enthalten, können Sie die folgende Methode verwenden, die auch verschachtelte Klammern entfernt.

String fileLineString = "Boston (MA), New York City (NY, (CT), NJ)"; 
Pattern pattern = Pattern.compile("\\([^()]*\\)"); 
String wasString; 
String res = fileLineString; 
do { 
    wasString = res; 
    res = pattern.matcher(wasString).replaceAll(""); 
} while (!wasString.equals(res)); 

res = res.replaceAll("\\s+,\\s+", ",").trim(); 
String[] cities = res.split(","); 

//Display the cities Array in Console... 
for (String citie : cities) { 
    System.out.println(citie); 
} 

Ausgabe auf Konsole wird:

Boston 
New York City 

Wenn Sie andere Klammern an den regulären Ausdruck hinzufügen möchten wie {}, [], oder sogar <>, dann können Sie dies tun:

  • Parenthesis Nur: "\\([^()]*\\)"
  • Parenthesis und Curly Brackets: "\\([^()]*\\)|\\{[^{}]*\\}"
  • Parenthesis, Curly Brackets und Eckige Klammern: "\\([^()]*\\)|\\{[^{}]*\\}||\\[[^\\[\\]]*\\]"
  • Parenthesis, Curly Klammern, eckige Klammern und Chevron Brackets: "\\([^()]*\\)|\\{[^{}]*\\}||\\[[^\\[\\]]*\\]|\\<[^<>]*\\>"

Mit dem letzten, es spielt keine Rolle, welche der vier In der Zeichenfolge werden Klammern gefunden. Sie und ihre Inhalte werden aus der Zeichenfolge entfernt, auch wenn eine oder alle ineinander verschachtelt sind.

0

Wenn ich dieses Problem behandle, werde ich IDE regex verwenden ersetzen alle ")," zu ") \ n", und dann werden Sie das Dokument in mehrere Zeilen, die durch ein Komma getrennt werden. Dann können Sie das Land und die Städte leicht erreichen.

0

Sie müssen so etwas versuchen.

Beispielcode

String str = "Boston (MA), New York City (NY, CT, NJ),New York City (NY, CT, NJ), Philadelphia (PA, NJ)"; 
Pattern bracket = Pattern.compile("(.*?)\\(.*?\\),?"); 
Matcher matcher = bracket.matcher(str); 
while(matcher.find()) { 
    System.out.println(matcher.group(1).trim()); 
} 

Es wird wieder nur Name City.

Verwandte Themen