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

War es hilfreich?

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

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+|$)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top