Desde el mensaje de error dado, lo que parece en nada a la expresión regular de cuerda mostrado, deduzco que la el patrón original era esencialmente el siguiente, del cual me he tomado la libertad de reformatear, agregar constantes simbólicas a, y prefacio con números de línea que podríamos inspeccionar y abordar con más facilidad.
(Todos los patrones no triviales deben siempre escribirse en (?x)
modo -. A pesar de Java lucha contra usted aquí, aún debe hacerlo)
1 (?: \P{L} | \W | ^)
2 (
3 (?: \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU}
4 | \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU}
5 | \N{KATAKANA LETTER HE} \N{KATAKANA LETTER ZU}
6 )
7 (?: \N{KATAKANA LETTER PA})
8 |
9 \N{KATAKANA LETTER PA}
10 )
11 |
12 \N{KATAKANA LETTER HA}
13 )
14 \N{COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK}
15 )
16 (?: \b | $)
Las primeras y últimas líneas están equivocados, pero están equivocados en una forma semántica relacionada con las expresiones regulares rotas de Java. No son sintácticamente mal.
Como debería ser ahora evidente, el problema sintáctico es que los paréntesis cercanos en las líneas 13 y 15 son espurios: no tienen paréntesis abiertos correspondientes.
A pesar de la primera y la última línea, todavía estoy tratando de entender qué es lo que realmente está tratando de hacer aquí. ¿Por qué la duplicación de las líneas 3 y 4? Eso no hace nada útil. Y no veo razón para la agrupación en la línea 7.
¿La intención es permitir que la marca de combinación se aplique a alguna de las anteriores?
En cuanto a los errores en la primera y la última línea, ¿entiendo que un simple límite de palabras es todo lo que estás buscando? ¿Pretendes incluir esos personajes fronterizos como parte de tu pareja, o solo estás tratando de establecer límites? ¿Por qué estás diciendo que no es una carta o una palabra no?
Los caracteres de palabra do incluyen letras, ya sabe, al menos, según la especificación Unicode que hacen, incluso si Java lo hace incorrecto. Desgraciadamente, acabas de incluir un montón de letras debido a la falla de expresiones regulares de Java, así que tendremos que recodificar esto una vez que entiendo lo que realmente quieres.
Si solo usara algo que fuera realmente compatible con UTS # 18, funcionaría bien, pero como supongo que no (no oí ninguna mención de ICU), tendremos que arreglarlo a lo largo de las líneas Tengo previously outlined.
Un lookbehind para una palabra no escrita o el inicio de una cadena funcionaría para la primera, y una búsqueda anticipada de una palabra no o el final de la cadena funcionaría para la última. Eso es lo que \b
es, por supuesto, supuestamente que se debe hacer frente a los caracteres de las palabras que tienes aquí, y podría funcionar de esa forma siempre que te mantengas alejado de tu partícula sin palabras.
Pero hasta que pueda ver más de la intención original, no creo que deba decir más.
El patrón en su mensaje de error * contiene * dos adicionales) - ¿está equivocado el mensaje de error o su publicación? – Erik
** No debe ** utilizar '\ W',' \ w', '\ s',' \ d', '\ b',' \ p {alpha} ', ni ninguna de las otras clases de caracteres accesos directos en expresiones regulares de Java, porque la biblioteca de expresiones regulares de Java no cumple con los [requisitos formales de las expresiones regulares de Unicode] (http://unicode.org/reports/tr18/#Compatibility_Properties). Puede simular '\ w' con' [\ pL \ pM \ p {Nd} \ p {Nl} \ p {Pc}] 'y' \ W' con '[^ \ pL \ pM \ p {Nd} \ p {Nl} \ p {Pc}] 'si no te importan los Enclosed_Alphanumerics.O puede usar una biblioteca de expresiones regulares o un lenguaje que cumpla con el estándar Unicode. Eso significa llamar a la biblioteca de expresiones reumáticas de la ICU, o llamar a Perl's, etc. – tchrist
¿Compiló con 'java -encoding UTF-8'? – tchrist