Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

140
Vistas
Capture texto después de varias cadenas opcionales en un grupo con nombre con Regex

Estoy tratando de extraer varias cadenas usando diferentes patrones de una cadena larga. Aquí hay un ejemplo de la cadena de entrada:

[Actualización 2] Número de estudiantes: 5 [Nuevo] Descanso a la 1:45 p. m.\nLos estudiantes involucrados son: John, Joseph, Maria\nAlmuerzo a las 2:00 p. m.\nActividades restantes: salto de longitud, barajar

Hay tres prefijos que se utilizan para extraer los datos después: 'Los estudiantes involucrados son:', 'Actividades restantes:', 'Número de estudiantes:'. Logré extraer lo anterior en un grupo con nombre usando el siguiente Regex:

 let pattern = /(?<=Number of students: )(?<number>[^\n]+).*?(?<=Students involved are: )(?<students>[^\n]+).*?(?<=Activities remaining: )(?<activities>[^\n]+)/gms let match = pattern.exec(s) const num = match.number; const activities = match.activities;

Lo anterior funciona. Sin embargo, me encuentro con un problema cuando falta una de las cadenas. Los tres prefijos que estoy buscando son opcionales. ¿Cómo puedo modificar la expresión regular para manejar patrones opcionales? ¿O hay una mejor manera de lograr esto? ¡Gracias!

about 4 years ago · Santiago Gelvez
2 Respuestas
Responde la pregunta

0

No estoy seguro de que necesite mirar detrás de las afirmaciones para ese caso de uso ...

Para responder a su pregunta, puede envolver sus patrones individuales dentro de grupos que no capturan seguidos de un signo de interrogación:

 const r = /(?:Desc.1:\s*(?<tag1>.*?))?(?:Descr.2:\s*(?<tag2>.*?))?(?:Desc.3:\s*(?<tag3>.*?))?/

Si los valores pueden venir en cualquier orden, puede usar una coincidencia global y una disyunción:

 const r = /x(?<tag1>.*)|y(?<tag2>.*)|z(?<tag3>.*)/g for (const {groups: {tag1, tag2, tag3}} of source.matchAll(r)) { ... }

Puedes verlo en acción aquí

Además, para tu información, las banderas que estás usando no tienen mucho sentido para mí:

  • g es útil para hacer coincidir varias veces (por ejemplo, con "".matchAll(/regexp/g) , pero de lo contrario es inútil)
  • m hace que las aserciones ^ y $ coincidan con el inicio y el final de las líneas además de su función habitual, pero no las está usando
about 4 years ago · Santiago Gelvez Denunciar

0

Aquí está mi intento:

 "^\[[^\]]+\](Number of students: )*(?<number>[^\n]+)\\n(Students involved are: )*(?<students>[^\n]+)\\n(Activities remaining: )*(?<activities>[^\n]+)"

Las diferencias entre el mío y el tuyo son las siguientes:

  • agregó ^\[[^\]]+\] al principio para que coincida con [<any characters>]
  • agregó * sobre las partes opcionales de su cadena
  • agregó \\n entre las tres partes emparejadas

He probado esta expresión regular con estos dos ejemplos:

  • [Update 2]Number of students: 5[New]Break at 1:45 pm\nStudents involved are: John, Joseph, Maria\nLunch at 2:00pm\nActivities remaining: long jump, shuffle
  • [Update 2]5[New]Break at 1:45 pm\nJohn, Joseph, Maria\nLunch at 2:00pm\nlong jump, shuffle

¿Funciona para ti?

PD. para cualquier intento de aumentar la eficiencia, se necesitan más muestras de coincidencia de patrones

about 4 years ago · Santiago Gelvez Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda