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)
¿Por qué querrías ignorar el '' s' en 'dog's'? – Justin
¿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
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 –