it-swarm.it

Divisione di stringhe tramite espressioni regolari mediante punteggiatura e spazi bianchi ecc. In java

Ho questo file di testo che ho letto in un'applicazione Java e poi conto le parole in esso riga per riga. In questo momento sto dividendo le linee in parole di a 

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

Ma so che sto perdendo alcune parole dal file di testo. Ad esempio, la parola "non può" dovrebbe essere divisa in due parole "può" e "t". 

Le virgole e altri segni di punteggiatura dovrebbero essere completamente ignorati e considerati come spazi bianchi. Ho cercato di capire come formare un'espressione regolare più precisa per farlo, ma sono un novizio quando si tratta di questo, quindi ho bisogno di aiuto.

Quale potrebbe essere una regex migliore per lo scopo che ho descritto?

20
Snorkelfarsan

Hai un piccolo errore nella tua espressione regolare. Prova questo:

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

[\\p{Punct}\\s]+ sposta il modulo + all'interno della classe di caratteri all'esterno. Altri saggi si dividono anche su un + e non combinano i caratteri divisi in una riga.

Quindi prendo questo codice

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

questo risultato

10
Ma
IO
conoscere
Per
esempio
il
Parola
può
t
dovrebbero 

Quale dovrebbe soddisfare il tuo requisito.

In alternativa puoi usare

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

\\P{L} significa che non è un punto di codice unicode con la proprietà "Lettera"

20
stema

Esiste un letterale non Word, \W, vedi 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);

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

Beh, vedere che vuoi contare non può essere come due parole, prova 

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

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

0
amal

Provare:

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

Questa è una o una corrispondenza di uno di questi caratteri: ., !;?:"' (nota che c'è uno spazio in là ma no/o \) il + fa sì che più caratteri insieme vengano contati come uno.

Questo dovrebbe darti un'accuratezza per lo più sufficiente. Le espressioni regolari più precise richiederebbero più informazioni sul tipo di testo che devi analizzare, perché "può essere anche un delimitatore di Word. Per lo più i delimitatori di Word con più segni di punteggiatura si trovano attorno a uno spazio vuoto, quindi anche l'abbinamento su [\\s]+ sarebbe un'approssimazione ravvicinata. (ma dà il conteggio sbagliato su brevi citazioni come: Ha detto: "no".)

0
Angelo Fuchs