web-dev-qa-db-fra.com

Fractionner des chaînes en expressions régulières par ponctuation et espaces blancs, etc. en java

J'ai ce fichier texte que j'ai lu dans une application Java, puis je compte les mots ligne par ligne. En ce moment, je divise les lignes en mots par un 

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

Mais je sais que certains mots du fichier texte me manquent. Par exemple, le mot "ne peut pas" doit être divisé en deux mots "peut" et "t". 

Les virgules et autres signes de ponctuation doivent être complètement ignorés et considérés comme des espaces. J'ai essayé de comprendre comment former une expression régulière plus précise pour le faire, mais je suis novice dans ce domaine et j'ai donc besoin d'aide.

Quel pourrait être un meilleur regex pour le but que j'ai décrit?

20
Snorkelfarsan

Vous avez une petite erreur dans votre regex. Essaye ça:

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

[\\p{Punct}\\s]+ déplace le formulaire + de la classe de caractères vers l'extérieur. Sinon, vous vous séparez également sur un + et ne combinez pas les caractères séparés dans une ligne.

Donc je reçois pour ce 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);
}

ce résultat

dix
Mais
JE
savoir
Pour
Exemple
la
Word
pouvez
t
devrait 

Ce qui devrait répondre à vos besoins.

Comme alternative, vous pouvez utiliser

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

\\P{L} signifie que ce n'est pas un point de code Unicode qui a la propriété "Letter"

20
stema

Il existe un littéral autre que Word, \W, voir 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);

donne

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

Eh bien, voyant que vous voulez compter ne peut pas compter deux mots, essayez 

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

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

0
amal

Essayer:

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

Ceci est une correspondance de l'un des caractères suivants: ., !;?:"' (notez qu'il y a un espace mais pas/ou \) le + fait que plusieurs caractères sont comptés ensemble.

Cela devrait vous donner une précision généralement suffisante. Des expressions rationnelles plus précises nécessiteraient davantage d'informations sur le type de texte à analyser, car 'peut également être un délimiteur Word. Généralement, la plupart des délimiteurs Word de ponctuation se trouvent autour d’un espace, la correspondance sur [\\s]+ serait également une approximation proche. (mais donne le mauvais compte sur de courtes citations comme: Elle a dit: "non".)

0
Angelo Fuchs