2010-10-28 25 views
7

tengo esta expresión regular que se supone que para eliminar delimitadores de oraciones (. y ?):Java expresiones regulares simple que no trabaja

sentence = sentence.replaceAll("\\.|\\?$",""); 

Funciona bien Convierte

"I am Java developer." a "I am Java developer"

"Am I a Java developer?" a "Am I a Java developer"

Pero después del despliegue w e encontró que también sustituye a cualquier otro puntos en la frase como

"Hi.Am I a Java developer?" convierte "HiAm I a Java developer"

Por qué sucede esto?

Respuesta

14

El pipe (|) tiene la prioridad más baja de todos los operadores. Por lo que su expresión regular:

\\.|\\?$ 

está siendo tratado como:

(\\.)|(\\?$) 

que coincide con un .cualquier lugar en la cadena y coincide con un ? al final de la cadena.

Para solucionar este problema, es necesario agrupar el . y ? juntos como:

(?:\\.|\\?)$ 

También es posible usar:

[.?]$ 

Dentro de una clase de caracteres . y ? son tratados literalmente, por lo que necesita no escapar de ellos.

+0

Gracias por la clara explicación. Ahora funciona. – user489849

+1

+1 Buena explicación. – jensgram

+1

Cuando agradece a alguien, verifique que su respuesta sea útil, eso es un mínimo ;-). +1 para la explicación detallada –

3

Se ha olvidado de abrazar los caracteres de final de frase con paréntesis:

sentence = sentence.replaceAll("(\\.|\\?)$",""); 

El mejor enfoque es utilizar como [.?]$ @ Marcos Byers sugerido.

sentence = sentence.replaceAll("[.?]$",""); 
7

Tu problema es debido a la baja precedence de alternation operator|. Su expresión regular no significa menos uno de:

  • . en cualquier lugar o
  • ? al final de una línea.

Utilice una clase de caracteres en su lugar:

"[.?]$" 
8

Lo que está diciendo con "\\.|\\?$" es "o bien un período de" o "un signo de interrogación como el último carácter".

En su lugar, recomendaría "[.?]$" para evitar el escape confuso (y el resultado no deseado, por supuesto).

+0

No es el único con esta idea, parece :) – jensgram

+1

+1 para alinear las puntuaciones con Mark Byers ya que son las mismas respuestas: p –

Cuestiones relacionadas