2011-02-10 32 views
6

Quiero dividir un texto en oraciones. Una oración termina con (punto) o? o! seguido por uno o más caracteres de espacios en blanco seguidos y la siguiente oración comienza con una letra mayúscula.Dividir texto en oraciones en C#

Por ejemplo:

Primera frase. ¡Segunda oración!

¿Cómo puedo hacer eso?

+12

¿Cómo manejarías esto: * "Cuando llegó a la casa, gritó" ¡Oye! ¿Alguien allí? ", Y luego abrió la puerta y entró." * ¿O usted tiene un control muy estricto sobre la entrada? –

+0

Agregué una expresión regular en mi answear que considera este caso. Ref http://www.regexlib.com/REDetails.aspx?regexp_id=2355 – Thea

+0

@Fredrik Mörk Su ejemplo es particularmente interesante. Me gustaría manejar como una sola frase – Lato

Respuesta

4

¿Qué idiomas quieren apoyar? Por ejemplo, en tailandés no hay espacios entre palabras y las oraciones se separan con espacio. Entonces, en general, esta tarea es muy compleja. También considere el útil comentario de Fredrik Mörk.

Por lo tanto, al principio debe definir un conjunto de reglas sobre qué es "oración". Entonces, le invitamos a usar una de las soluciones sugeridas.

+1

Quiero apoyar principalmente el inglés. Hay un montón de estado particular. por ejemplo, tengo que considerar Abreviaturas (Dr. Jekyll) – Lato

+0

¡muchas gracias! – Lato

5

¿Has probado String.Split()? Consulte la documentación al respecto here

+3

sí lo hice, pero no es suficiente. En el texto hay enlaces. (Por ejemplo: www.misitio.it) – Lato

5

Prueba esto (MSDN)

char[] separators = new char[] {'!', '.', '?'}; 
string[] sentences1 = "First sentence. Second sentence!".Split(separators); 
//or... 
string[] sentences2 = "First sentence. Second sentence!".Split('!', '.', '?'); 
24

Se puede dividir en una expresión regular que coincide con el espacio en blanco, con una búsqueda hacia atrás que se ve por las terminaciones de frase:

string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+"); 

Esto se dividirá en los caracteres de espacios en blanco y mantendrá los terminadores en las oraciones.

Ejemplo:

string input = "First sentence. Second sentence! Third sentence? Yes."; 
string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+"); 

foreach (string sentence in sentences) { 
    Console.WriteLine(sentence); 
} 

Salida:

First sentence. 
Second sentence! 
Third sentence? 
Yes. 
+1

gracias gracias ¡¡¡gracias !!!!!!!!!!!!! gracias, gracias, gracias .. gracias un montón ... lo necesitaba tanto ... estaba luchando con la función string.split() que solo otorga carácter único. –

+1

Tenga cuidado porque esto no funcionaría para cosas como "Hola, Sr. y Sra. Smith". – Yodacheese

+0

@Yodacheese: Sí, eso es cierto. Se requeriría un análisis mucho más avanzado del significado de la oración para captar cuando un período realmente termina una oración. Considere por ejemplo las oraciones '' El honorífico es el Sr. Smith es el apellido ''. – Guffa

Cuestiones relacionadas