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.

Coincidencia de regex con el apóstrofe dentro, pero no alrededor de las palabras, dentro de un conjunto de caracteres.

Estoy contando cuántas veces aparecen diferentes palabras en un texto usando Expresiones Regulares en JavaScript. Mi problema es cuando tengo palabras entre comillas: 'palabra' debería contarse simplemente como palabra (sin las comillas, de lo contrario se comportarían como dos palabras diferentes), mientras que it's debería contar como una sola palabra completa.

(?<=\w)(')(?=\w)

Esta expresión regular puede identificar apóstrofes dentro de una palabra, pero no alrededor de ellas. El problema es que no puedo usarla dentro de un conjunto de caracteres como [\w]+.

(?<=\w)(')(?=\w)|[\w]+

Cuenta it's a 'miracle' of nature como 7 palabras en lugar de 5 (it, ', s convirtiéndose en 3 palabras diferentes). Además, la tercera palabra debería ser seleccionada simplemente como milagro, y no como 'miracle'.

Para complicar aún más las cosas, necesito capturar diacríticos también, así que estoy usando [A-Za-zÀ-ÖØ-öø-ÿ] en lugar de \w.

¿Cómo puedo lograr esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución podría ser utilizar un “positive lookahead” para comprobar si la palabra que coincide está seguida de un apóstrofe que no está seguido por otro carácter de palabra. Esto nos permitiría coincidir con las palabras con apóstrofes sin incluir los apóstrofes como palabras separadas. Aquí tienes un ejemplo de regex:

    [A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]+(?=(?:'(?!\w))?\W|$)

    Veamos cómo funciona:

    • [A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]+ coincide con uno o más caracteres de palabra o diacríticos. Es similar a utilizar \w, pero incluye diacríticos también.
    • (?= comienza un “positive lookahead” que comprueba si la coincidencia está seguida de:
      • (?:'(?!\w))? un apóstrofe opcional que no está seguido por un carácter de palabra. Esto asegura que no coincidimos apóstrofes dentro de palabras o al final de palabras.
      • \W|$ un carácter que no es de palabra o el final de la cadena. Esto asegura que coincidimos con palabras que terminan con un apóstrofe o con puntuación también.

    Usando esta regex, podemos contar las palabras en un texto sin incluir los apóstrofes como palabras separadas, y también capturando diacríticos. Sin embargo, es importante mencionar que esta regex puede que no maneje todos los casos límite perfectamente, y puede que haya casos donde no coincida con los límites de las palabras deseadas. Por lo tanto, siempre es buena idea probar las regex a fondo en escenarios reales.

Comments are closed.