2011-02-11 15 views
12

Tengo un párrafo en una sola cadena y me gustaría obtener todas las palabras en ese párrafo.¿Cómo obtener todas las palabras de una cadena en C#?

Mi problema es que no quiero las palabras sufijos que terminan con signos de puntuación como (',', '.', '' ',' "','; ',': ','! ' '?') y/n/t etc

Asimismo, no quiero decir con' s 'y m tal como world's donde sólo debería devolver mundo.

En el ejemplo he said. "My dog's bone, toy, are missing!"

la lista debería ser: he said my dog bone toy are missing

+3

¿Por qué querrías ignorar el '' s' en 'dog's'? – Justin

+2

¿No puedes dividir la cadena en caracteres blancos, como espacios, líneas nuevas y otros? Todo entre dos espacios en blanco es una palabra ... – Cipi

+0

estoy haciendo algo que crea un relleno en la actividad de espacios en blanco. entonces si el párrafo contiene un nombre con 's.Creo que es bueno irse y solo obtener el nombre –

Respuesta

20

Ampliando Shan's answer, consideraría algo así como un punto de partida:

MatchCollection matches = Regex.Match(input, @"\b[\w']*\b"); 

Por qué incluir el carácter '? Porque esto evitará que las palabras como "nosotros" se dividan en dos palabras. Después de capturarlo, puede quitar manualmente el sufijo usted mismo (mientras que de lo contrario, no podría reconocer que re no es una palabra e ignorarlo).

Así:

static string[] GetWords(string input) 
{ 
    MatchCollection matches = Regex.Matches(input, @"\b[\w']*\b"); 

    var words = from m in matches.Cast<Match>() 
       where !string.IsNullOrEmpty(m.Value) 
       select TrimSuffix(m.Value); 

    return words.ToArray(); 
} 

static string TrimSuffix(string word) 
{ 
    int apostropheLocation = word.IndexOf('\''); 
    if (apostropheLocation != -1) 
    { 
     word = word.Substring(0, apostropheLocation); 
    } 

    return word; 
} 

Ejemplo de entrada:

he said. "My dog's bone, toy, are missing!" What're you doing tonight, by the way?

Ejemplo de salida:

[he, said, My, dog, bone, toy, are, missing, What, you, doing, tonight, by, the, way]

Una limitación de este enfoque es que no va a manejar bien acrónimos; por ejemplo, "Y.M.C.A." Sería tratado como cuatro palabras. Creo que también podría manejarse incluyendo . como un personaje que coincida en una palabra y luego quitándolo si es un punto final después (es decir, verificando que es el único período en la palabra, así como el último carácter)

+1

Si usa '@" \ b [w '] + \ b "', entonces no debería necesitar eliminar los elementos para los cuales 'string.IsNullOrEmpty'. Obtengo un 'IEnumerable ' con 'from Match m in Regex.Matches (text, @" \ b [\ w '\ u2019] + \ b ") selecciona m.Value' (que también incluye apóstrofes rizados). –

0

dividir en espacios en blanco, recorte cualquier cosa que no sea una letra en las cadenas resultantes.

2

la esperanza que esto sea útil para usted:

 string[] separators = new string[] {",", ".", "!", "\'", " ", "\'s"}; 
     string text = "My dog's bone, toy, are missing!"; 

     foreach (string word in text.Split(separators, StringSplitOptions.RemoveEmptyEntries)) 
      Console.WriteLine(word); 
-1

Aquí es un método de bucle reemplazar ... no es rápido, sino una manera de resolverlo ...

string result = "string to cut ' stuff. ! out of";

".',[email protected]".ToCharArray().ToList().ForEach(a => result = result.Replace(a.ToString(),""));

Esto supone que desea colocarlo de nuevo en la cadena original , no una nueva cadena o una lista.

Cuestiones relacionadas