es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Coincidir con caracteres que no sean palabras hasta encontrar caracteres que no sean palabras que los engloben si se encuentran.

Quiero encontrar cualquier carácter que no sea una palabra desde la posición inicial o final de una cadena, pero si se encuentra con un carácter que no es una palabra que encierra una cadena, quiero que deje de encontrar inmediatamente antes del carácter.

Creé el siguiente patrón de regex:

^\W+(?!(\W+)((?!\1).)+\1)?

Esperaba que encontrara como se muestra en la siguiente imagen, ya que podría encontrar cualquier carácter que no sea una palabra desde el principio de la cadena hasta que llegara a las comillas que encierran la cadena en la búsqueda negativa:

[Imagen de ejemplo]

Pero el resultado fue este:

[Imagen de resultado]

¿Qué estoy haciendo mal?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el negative lookahead en el patrón no está haciendo lo que esperas que haga. En lugar de detener la coincidencia justo antes de las comillas de cierre, sigue coincidiendo con todos los caracteres que no son palabras hasta el final de la cadena.

    Una solución posible a este problema es usar una combinación de afirmaciones de positive y negative lookbehind para coincidir con los caracteres que no son palabras desde la posición de inicio y final de la cadena, al mismo tiempo que se excluyen los caracteres que no son palabras que están encerrados entre comillas. Aquí está el patrón regex modificado:

        (?<!\w)\W+(?!(?<=\”)\W+|\W+(?=\”))(?!\w)

    Este patrón consta de los siguientes componentes:

    • (?<!\w)\W+: Una afirmación de positive lookbehind que coincide con cualquier carácter que no sea una palabra al inicio de la cadena, seguido de uno o más caracteres que no son palabras.
    • (?!(?<=\")\W+|\W+(?=\")): Una afirmación de negative lookahead que verifica si la posición actual no está seguida de una secuencia de caracteres que no son palabras que están encerrados entre comillas (es decir, una afirmación de positive lookbehind para una comilla, seguida de uno o más caracteres que no son palabras, seguida de una afirmación de positive lookahead para una comilla). Esto se logra usando el operador de alternancia | para hacer coincidir cualquiera de las dos afirmaciones de lookbehind/lookahead.
    • (?!\w): Una afirmación de negative lookahead que coincide con cualquier carácter que no sea una palabra al final de la cadena.

    Con este patrón, se están haciendo coincidir los caracteres que no son palabras desde el inicio y el final de la cadena, mientras que se excluyen los caracteres que no son palabras que están encerrados entre comillas. Aquí hay una demostración del patrón modificado:

    Demostración Regex101

Comments are closed.