2011-09-05 8 views
8

Ho visto alcune domande simili ma sto cercando di ottenere questo risultato.Suddivisione della frase in parole ma problemi con le punteggiature in C#

Dato una stringa, str = "La luna è il nostro satellite naturale, cioè ruota attorno alla Terra!" Voglio estrarre le parole e memorizzarle in un array. Gli elementi di array previsti sarebbero questo.

the 
moon 
is 
our 
natural 
satellite 
i.e. 
it 
rotates 
around 
the 
earth 

Ho provato a utilizzare String.split (',' \ t ',' \ r ') ma questo non funziona correttamente. Ho anche provato a rimuovere il., E altri segni di punteggiatura, ma vorrei una stringa come "i.e." da analizzare anche Qual è il modo migliore per raggiungere questo obiettivo? Ho anche provato a usare regex.split inutilmente.

string[] words = Regex.Split(line, @"\W+"); 

Apprezzerei sicuramente alcuni suggerimenti nella giusta direzione.

+0

Il secondo '.' in 'i.e' e una punteggiatura' .' sono indistinguibili a meno che non si aggiunga un elenco di parole che si sa terminare in '.'. – CodesInChaos

+12

Prendo atto che la luna * ruota * attorno al proprio asse. * Gira * intorno alla terra. –

risposta

26

Una soluzione regex.

(\b[^\s]+\b) 

E se davvero vuole risolvere che lo scorso . su i.e. si potrebbe usare questo.

((\b[^\s]+\b)((?<=\.\w).)?) 

Ecco il codice che sto utilizzando.

var input = "The moon is our natural satellite, i.e. it rotates around the Earth!"; 
    var matches = Regex.Matches(input, @"((\b[^\s]+\b)((?<=\.\w).)?)"); 

    foreach(var match in matches) 
    { 
    Console.WriteLine(match); 
    } 

Risultati:

The 
moon 
is 
our 
natural 
satellite 
i.e. 
it 
rotates 
around 
the 
Earth 
+0

Ma non includerà la punteggiatura come parte della parola? Quindi nell'esempio sopra l'ultima parola sarebbe "Terra!" ... –

+0

No, non corrisponderà alla punteggiatura in terra. '\ b' corrisponde ai confini delle parole. – TheCodeKing

+0

@Thecodeking, che dire della corrispondenza "i.e."? o qualcosa come "u.n.i.c.e.f"? –

2

Questo funziona per me.

var str="The moon is our natural satellite, i.e. it rotates around the Earth!"; 
var a = str.Split(new char[] {' ', '\t'}); 
for (int i=0; i < a.Length; i++) 
{ 
    Console.WriteLine(" -{0}", a[i]); 
} 

Risultati:

-The 
-moon 
-is 
-our 
-natural 
-satellite, 
-i.e. 
-it 
-rotates 
-around 
-the 
-Earth! 

si potrebbe fare un po 'di post-processing dei risultati, la rimozione di virgole e punti e virgola, ecc

+0

Questa sarebbe la soluzione migliore. La post-elaborazione sarebbe considerata inefficiente per casi come questi? –

8

Ho il sospetto che la soluzione che stai cercando è molto più complessa di quanto si pensi. Stai cercando una qualche forma di analisi del linguaggio attuale, o almeno un dizionario, in modo che tu possa determinare se un punto fa parte di una parola o termina una frase. Hai considerato il fatto che potrebbe fare entrambe le cose?

Considera l'aggiunta di un dizionario di "parole che contengono segni di punteggiatura". Questo potrebbe essere il modo più semplice per risolvere il tuo problema.

+0

Regex lo fa con '\ b' quindi non devi, ammetto che ci sono alcune aree grigie. Ad esempio, "i" e "match" come "i". – TheCodeKing

1
Regex.Matches(input, @"\b\w+\b").OfType<Match>().Select(m => m.Value) 
Problemi correlati