it-swarm.com.de

Aufteilen von Strings durch reguläre Ausdrücke durch Interpunktion und Leerzeichen usw. in Java

Ich habe diese Textdatei, die ich in eine Java-Anwendung eingelesen habe, und zähle dann die Wörter darin Zeile für Zeile. Zur Zeit spalte ich die Zeilen durch ein 

String.split([\\p{Punct}\\s+])"

Aber ich weiß, dass mir einige Wörter aus der Textdatei fehlen. Zum Beispiel sollte das Wort "kann" nicht in zwei Wörter "kann" und "t" unterteilt werden. 

Kommas und andere Satzzeichen sollten vollständig ignoriert und als Leerzeichen betrachtet werden. Ich habe versucht zu verstehen, wie man einen genaueren regulären Ausdruck bildet, um dies zu tun, aber ich bin ein Neuling, wenn es darum geht, also brauche ich Hilfe.

Was könnte eine bessere Regex für den beschriebenen Zweck sein?

20
Snorkelfarsan

Sie haben einen kleinen Fehler in Ihrer Regex. Versuche dies:

String[] Res = Text.split("[\\p{Punct}\\s]+");

[\\p{Punct}\\s]+ verschiebt das +-Formular innerhalb der Zeichenklasse nach außen. Ansonsten teilen Sie sich auch auf einen + und kombinieren keine geteilten Zeichen in einer Reihe.

Also bekomme ich für diesen Code

String Text = "But I know. For example, the Word \"can\'t\" should";

String[] Res = Text.split("[\\p{Punct}\\s]+");
System.out.println(Res.length);
for (String s:Res){
    System.out.println(s);
}

dieses Ergebnis

10
Aber
ich
kennt
Zum
Beispiel
das
Wort
können
t
sollte 

Welches sollte Ihre Anforderung erfüllen.

Als Alternative können Sie verwenden

String[] Res = Text.split("\\P{L}+");

\\P{L} bedeutet ist kein Unicode-Codepunkt mit der Eigenschaft "Letter".

20
stema

Es gibt ein Nicht-Word-Literal \W, siehe Pattern .

String line = "Hello! this is a line. It can't be hard to split into \"words\", can it?";
String[] words = line.split("\\W+");
for (String Word : words) System.out.println(Word);

gibt

Hello
this
is
a
line
It
can
t
be
hard
to
split
into
words
can
it
9
Qwerky

Nun, da Sie sehen wollen, dass Sie nicht zählen wollen, können Sie es nicht als zwei Wörter versuchen 

split("\\b\\w+?\\b")

http://www.regular-expressions.info/wordboundaries.html

0
amal

Versuchen:

line.split("[\\.,\\s!;?:\"]+");
or         "[\\.,\\s!;?:\"']+"

Dies ist ein oder entspricht einem dieser Zeichen: ., !;?:"' (Beachten Sie, dass dort ein Leerzeichen ist, aber kein/oder \). Das + bewirkt, dass mehrere Zeichen zusammen als eins gezählt werden.

Das sollte Ihnen eine größtenteils ausreichende Genauigkeit bieten. Präzisere Regexes benötigen mehr Informationen über die Art des zu analysierenden Textes, da sie auch ein Word-Trennzeichen sein können. Meistens sind die meisten Satzzeichen von Word-Trennzeichen um einen Leerraum, sodass das Übereinstimmen mit [\\s]+ auch eine Annäherung wäre. (aber er zählt falsch auf kurze Zitate wie: Sie sagte: "Nein".)

0
Angelo Fuchs