2012-10-03 10 views
6

Tengo problemas con una expresión regular cuando me oriento a la plataforma Android 2.2.3.Android word opcional border regex

La siguiente expresión regular funciona al apuntar a Java VM en mi escritorio y la expresión regular también está funcionando también en una aplicación .NET.

Pattern.compile("\\b?") 

Pero cuando me oriento en mi teléfono obtengo una excepción PatternSyntaxException. ¿Algunas ideas?

+0

No sé la motivación del error ... pero este es un límite de palabra opcional (y sin embargo de longitud cero) ... ¿qué eres? va a coincidir después de todo? – Gabber

+0

Bueno, es una expresión regular bastante complicada de un proyecto diferente. Pero no veo por qué un límite de palabra opcional debería ser una sintaxis de patrón no válida. – Tentux

Respuesta

4

Puedo confirmar que esto arroja un PatternSyntaxException cuando se ejecuta en el emulador de Android, pero no en una aplicación Java normal. No puedo ver por qué ese sería el caso, aparte del hecho de que la implementación de expresión regular utilizada en Android es diferente a la del SDK de Java normal. De la página de Pattern Desarrolladores de Android:

La implementación de expresiones regulares utilizada en Android es proporcionada por la ICU. La notación para las expresiones regulares es principalmente un superconjunto de los utilizados en otras implementaciones de lenguaje Java. Esto significa que las aplicaciones existentes normalmente funcionarán como se espera, pero en casos excepcionales, Android puede aceptar una expresión regular que no sea aceptada por otras implementaciones.

Como solución alternativa, descubrí que puede evitar la excepción al adjuntar la afirmación de límite de palabras en un grupo que no captura.

Pattern.compile("(?:\\b)?"); 

(Un grupo de captura funciona tan bien, pero dudo que lo necesite.)

Te sugiero report this as a bug para ver si puede obtener una respuesta oficial. (Ya he buscado, y no parece que se haya informado aún)

+1

Pero tenga en cuenta que es un error solo en el sentido de que Android rechaza algunas expresiones regulares que acepta la implementación de referencia. No tiene ningún sentido incluir una aserción de ancho cero y luego hacerla opcional. Usted está diciendo, * esta condición debe ser cierta, pero está bien si no lo hace. * Al rechazarla, el compilador lo alerta sobre lo que es un error tipográfico o una falla de comprensión por parte del autor. –

+1

@ AlanMoore Estaba tratando de imaginar qué aspecto tendría el resto de la expresión regular del OP para necesitar un límite de palabra opcional, pero creo que tienes razón. No tiene sentido. La forma en que haces que un límite de palabras sea opcional es simplemente no incluirlo en la expresión regular. –

+0

@BilltheLizard De acuerdo. No creo que tenga sentido. No soy el autor de la expresión regular original. Tal vez malinterpreté su uso de '?' podría ser parte de un grupo de captura posiblemente. De todos modos, he decidido implementar la misma solución a mi manera. – Tentux