Una expresión regular para \ b
-
12-09-2019 - |
Pregunta
Estoy escribiendo expresiones regulares de texto Unicode en Java. Sin embargo, para el guión particular que estoy usando - Devanagari (0900 - 097F) hay un problema con los límites de palabra. \ B coincide con los caracteres que son vocales dependientes (como 093E-094C), ya que son tratados como caracteres de espacio.
Ejemplo: Supongamos que tengo la cadena: "कमल कमाल कम्हल कम्हाल" Tenga en cuenta que 'मा' en la segunda palabra se forma combinando म y ा (reconocido como un carácter de espacio). Del mismo modo, en la última palabra. Esto conduce \ b para que coincida con el 'ल' en 'कमाल' con expresión regular \ b \ w \ b que no es correcta de acuerdo con el lenguaje.
Espero que el ejemplo de ayuda.
¿Puedo escribir una expresión regular que se comporta como \ b, excepto que no coincide con ciertos caracteres? Cualquier comentario será agradecido.
Solución
Usted debe ser capaz de lograr lo que quiere con los siguientes operadores de expresiones regulares:
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
(Lo anterior es citado de la Java 6 documentación de la API del patrón .)
Uso (?<![foo])(?=[foo])
en lugar de \b
antes de una palabra, y (?<=[foo])(?![foo])
en lugar de \b
después de una palabra, donde "[foo]
" es el conjunto de caracteres "palabra"
Otros consejos
El equivalente para los límites de las palabras (si los límites no lo que estabas esperando para son) sería:
(?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])
Esto se debe a un "límite de palabra" significa "un lugar donde hay un personaje en un lado y no en el otro)
Así que con Look-Ahead expresiones mirada-atrás y, puede definir su propia clase de caracteres [X-Y] para comprobar cuando se desea aislar un "límite de la palabra"