Verwendung von Trennzeichen-Funktion von Scanner für „abc-def“
-
09-09-2019 - |
Frage
Ich versuche zur Zeit eine Textdatei zu filtern, die Wörter enthält, die mit einem getrennt sind „-“. Ich möchte die Worte zählen.
scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));
Das Problem, das einfach auftritt: Wörter, die ein enthalten wird „-“ get getrennt und gezählt dafür, zwei Worte. Also nur mit \ entkommen -. Ist nicht die Lösung der Wahl
Wie kann ich den Begrenzer Ausdruck zu ändern, so dass Wörter wie „foo-bar“ bleiben, aber die „-“ wird allein herausgefiltert und ignoriert
?Danke;)
Lösung
OK, ich bin auf Ihre Frage zu raten hier: Sie meinen, dass Sie eine Textdatei mit einigen „echten“ Prosa, dh Sätze, die tatsächlich Sinn machen, werden durch Interpunktion und dergleichen, getrennt usw. rechts / p>
Beispiel:
Diese Situation verbessert wird - soweit wir das beurteilen können - durch die Tatsache, dass unsere größt Verbündete, die Vorgons, weiterhin ihre Poetry Slam Wettbewerbe zu halten; der Feind wenig Anreiz hat, mit, dass auch bei ihren Mute-O-Matic-Geräten.
einzumischen
Also, was Sie brauchen, als Trennzeichen ist etwas, das entweder eine beliebige Menge von Leerzeichen und / oder Zeichensetzung (die Sie bereits mit dem regulären Ausdruck abgedeckt haben Sie gezeigt) oder ein Bindestrich, die von mindestens einem Leerzeichen auf jeder Seite umgeben ist . Das Regex-Zeichen für „oder“ ist „|“. Es ist eine Abkürzung für die Leerzeichenklasse (Leerzeichen, Tabulatoren und Zeilenumbrüche) in vielen Regex-Implementierungen. „\ S“
"[.,:;()?!\"\s]+|\s+-\s+"
Andere Tipps
Wenn möglich, versuchen die vordefinierten Klassen zu verwenden ... macht den Regex viel einfacher zu lesen. Siehe java.util.regex.Pattern für Optionen.
Vielleicht ist es das, was Sie suchen:
string.split("\\s+(\\W*\\s)?"
Liest:. Match 1 oder mehr Leerzeichen Zeichen gegebenenfalls gefolgt von null oder mehr Nicht-Wort-Zeichen und ein Leerzeichen
Das ist nicht ganz einfach. Eine Sache, um zu versuchen, wäre {current-delimeter-Zeichen} {Null-oder-mehr-Bindestriche} {Null-oder-mehr-Strom-Trennzeichen-Zeichen-oder-Bindestrich}.
Es könnte einfacher sein, nur Worte durch den Scanner zurück ignoriert vollständig aus Bindestrichen aus
Scanner scanner = new Scanner("one two2 - (three) four-five - ,....|");
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+");
while (scanner.hasNext()) {
System.out.println(scanner.next("\\w+(-\\w+)*"));
}
NB
der nächste (String) -Methode behauptet, dass Sie seit dem ursprünglichen useDelimiter nur Worte get () Methode Misses "|"
NB
Sie den regulären Ausdruck verwendet haben "\ r \ n | \ n" als Zeilenabschluss. Die JavaDocs für java.util.regex.Pattern zeigt andere mögliche Leitungsabschlüsse, so eine vollständige Überprüfung den Ausdruck verwenden würde "\ r \ n | [\ r \ n \ u2028 \ u2029 \ u0085]"
Dies sollte ein einfach genug sein: [^\\w-]\\W*|-\\W+
- Aber natürlich, wenn es Prosa, und Sie ausschließen möchten unterstreicht :
[^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
- oder, wenn Sie nicht erwarten, Numerik:
[^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+
EDIT: Diese sind einfacher Formen. Halten Sie die komplette Lösung im Sinne, dass Bindestriche am Anfang und Ende der Zeilen dieses Muster folgen würde behandeln würde. (?:^|[^\\w-])\\W*|-(?:\\W+|$)