2011-03-10 33 views
5

Estoy haciendo una expresión regular para encontrar el final de las oraciones en un texto. Aquí, supongo que cualquier oración puede terminar con cualquiera de ellas.!? A veces, aunque la gente como dos escribe !!!!!! en el y de su oración. Así que quiero reemplazar cualquier punto repetitivo, signo de exclamación o signo de interrogación. Pero quiero permitir el uso de '...'. ¿Cómo puedo incluir esta excepción? Aconseja, gracias!Expresión regular para encontrar el final de las oraciones

Pattern p = null; 
    try { 
    //([!?.] with optional spaces), followed by ([!?.] with optional spaces) repeated 1 or more times 
     p = Pattern.compile("([!?.]\\s*)([!?.]\\s*)+"); 
    } 
    catch (PatternSyntaxException pex) { 
     pex.printStackTrace(); 
     System.exit(0); 
    } 

    //get the matcher 
    Matcher m = p.matcher(this.sentence); 
    int index = 0; 
    while(m.find(index)) 
    { 
     System.out.println(this.sentence); 
     System.out.println(p.toString()); 
     String toReplace = sentence.substring(m.start(), m.end()); 
     toReplace = toReplace.replaceAll("\\.","\\\\."); 
     toReplace =toReplace.replaceAll("\\?","\\\\?"); 
     String replacement = ""+sentence.charAt(m.start()); 
     this.sentence = this.sentence.replaceAll(toReplace, replacement); 
     System.out.println(""); 
     index = m.end(); 
     System.out.println(this.sentence); 
    } 
+6

Puede tener períodos dentro de oraciones sin que marquen el final de la oración, p. como en este. –

+0

No necesita RegEx para ** buscar ** fin de oraciones. ¿Qué tipo de entrada estás usando? ¿Es texto sin formato? ¿Qué formato de salida te gustaría? ¿Están las oraciones separadas por una nueva línea? – vbence

+0

Probablemente sea casi imposible considerar todos los casos extremos (consulte el comentario de Christoffer). – helpermethod

Respuesta

2

Descargo de responsabilidad: mi respuesta estará fuera de tema (no utilizando expresiones regulares).

Si no es demasiado pesado, intente utilizar Apache OpenNLP. NLP significa "procesamiento del lenguaje natural". Consulte la documentación en detecting sentences.

El bit correspondiente del código es:

String sentences[] = sentenceDetector.sentDetect(" First sentence. Second sentence. "); 

Usted obtendrá un conjunto de dos Strings. El primero será "Primera oración", el segundo será "Segunda oración".

Se debe escribir más código antes de usar la línea de código mencionada anteriormente, pero se entiende la idea general.

0

La solución más simple para esto suele ser reemplazar primero todas las apariciones de la cadena "..." con algún carácter especial que no esté en el texto, por ejemplo, un carácter de control ASCII.

Después de este reemplazo, reemplace todas las instancias múltiples de sus caracteres de final de frase con sencillos.

Luego encuentra el final de las oraciones con los caracteres al final de la oración + el carácter especial que usaste para reemplazar "..." (si quieres "..." para indicar el final de una oración)

Por último, reemplace el carácter especial con "..." nuevamente.

No soy un programador de Java, así que no puedo darle un código de Java específico para hacerlo, pero la forma más fácil para este tipo de problema suele ser varias instrucciones de división/unión que no reemplaza.

así que algo como:

str.split("...").join("<special char>") 
0

La solución más simple expresión regular para el "..." El caso es sólo para usar un partido cuantificado:

someString.split("(\\.{1,2})|(\\.{4,})|(\\?+)|(!+)"); 

Esto es, por supuesto, sin tener en cuenta el otro borde casos como ya se mencionó.

+0

¿No hay una forma de usar la negación? me gusta ([!?.] \\ s *) ([!?.] \\ s *) + AND NOT (\\. {3})? –

+0

Por lo que sé, no hay negación en las expresiones regulares (excepto para las clases de caracteres). Podría decir algo como ". {1,2} ([^.] |. {2,})", es decir, 1 o 2 . seguido de algo que no es un período o al menos dos períodos más seguidos. –

0

Estoy trabajando en algo como esto. Hasta ahora, parece que puedo dividir mis párrafos (agrupados en líneas en blanco entre texto) en oraciones buscando los caracteres [.?!] Cuando a veces los hay a) uno o dos espacios y luego una palabra (ni una sola letra) con mayúsculas iniciales ob) nada, ya que es el final del párrafo. En mi caso, no tengo ningún texto entrecomillado, pero ese es un caso que quisiera excluir si encuentro alguno. Estoy procesando documentos legales/financieros, por lo que no estoy seguro de que 'NLP' sea útil; el lenguaje es casi natural. Pero puedo echarle un vistazo. Crear un RegEx adecuado parece difícil, por lo que un enfoque NLP podría ahorrar tiempo.

Cuestiones relacionadas