Pregunta

Estoy trabajando en una aplicación que busca en el texto usando expresiones regulares en base a la entrada de un usuario. Una opción es que el usuario tiene que incluir un "ajuste de 0 o más caracteres" comodín utilizando el asterisco. Necesito esto para solo entre los límites de las palabras. Mi primer intento fue convertir a todos los asteriscos (?:(?=\B).)*, que funciona bien para la mayoría de los casos. Donde falla es que al parecer .Net considera la posición entre un carácter Unicode con una diacrítica y otro personaje una palabra-break. Considero que esto es un error, y lo he enviado al sitio retroalimentación Microsoft .

En el ínterin, sin embargo, que necesito para obtener la funcionalidad implementada y el producto enviado. Estoy considerando el uso de [\p{L}\p{M}\p{N}\p{Pc}]* como el texto de reemplazo, pero, francamente, estoy en "No entiendo muy bien lo que esto va a hacer" tierra. Es decir, yo puedo leer las especificaciones, pero no estoy seguro de que lo suficientemente pude probar esto para asegurarse de que está haciendo lo que espero. Simplemente, no sabría todas las condiciones de contorno a prueba. La aplicación es utilizada por obreros transculturales, muchos de los cuales están en ubicaciones tribales, por lo que necesitan apoyo, incluyendo algunos que utilizan ancho cero separaciones de palabras cualquiera y todos los sistemas de escritura.

¿Alguien tiene una solución más elegante, o pudo confirmar / corregir el código anterior, u ofrecer algunos consejos?

Gracias por su ayuda.

¿Fue útil?

Solución

El equivalente de /(?:(?=\B).)*/ en un contexto Unicode sería:

/
(?:
  (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}])
  |   (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}])
  )
  .
)*
/

... o algo simplificada:

/(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/

Esto se correspondería con una palabra o un no-palabra (espaciado, puntuacion etc.) secuencia, posiblemente una vacía.

Un límite de palabra normal o negada (\b o \B) es básicamente un doble mirar a los lados. Uno mirando hacia atrás, asegurándose de que el tipo de carácter que precede a la posición actual. Del mismo modo uno mirando hacia el futuro.

En la segunda expresión regular, le quité el puesto de observación rodeos y se utiliza clases de personajes simples en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top