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

165
Vistas
Separar texto en elementos separados usando un patrón - javascript

Disculpas de antemano por mi código atroz/intentos de explicar lo que estoy tratando de lograr...

Quiero tomar varias transcripciones, con marcas de tiempo, y convertirlas a un formato consistente para crear subtítulos. Las transcripciones no provienen de las mismas fuentes y la estructura de los documentos y las marcas de tiempo varían, a veces incluso dentro del mismo documento.

El formato de la marca de tiempo es [HH:MM:SS.FF] (puedo manejar las variaciones) y está contenido dentro del texto. Y las marcas de tiempo a veces indican un punto final (generalmente son solo un punto de inicio).

Entonces el formato es

 [Timestamp1]Some text with various line breaks and weird characters. [Timestamp2]More text where this transcript continues but ends with some silence after this [Timestamp3] [Timestamp4]The next sentence begins and ends at the last [Timestamp5]

¿Cuál es el mejor enfoque de codificación para esto en JavaScript? He recorrido las casas con string.split y re.matchAll, pero ninguno de los patrones de expresiones regulares que se me ocurren pueden manejar las 2 marcas de tiempo seguidas.

Creo que lo ideal sería tener el patrón de expresiones regulares que obtiene la marca de tiempo y luego almacenar una matriz de objetos que tienen una marca de tiempo de inicio y fin (el final es el siguiente inicio si el final no existe) y el texto asociado.

Entonces, para el ejemplo anterior, tendría

 Start: Timestamp1 End: Timestamp2 Text: "Some text..." Start: Timestamp2 End: Timestamp3 Text: "More text..." Start: Timestamp4 End: Timestamp5 Text: "The next..."

Este es uno de mis últimos intentos...

 function test(){ str = `[09:35:10.00] 1. Lorem ipsum... [09:35:13.11] [09:35:15.14] 2. sed do eiusmod... [09:35:39.20] 3. anim id est laborum... [09:35:43.17]` var re = /(?<tc1>\[?(?:[0-1][0-9]|2[0-3]|[0-9]):(?:[0-5][0-9]):(?:[0-5][0-9])(?:\.(?:[0-9]{2,3})?\]?))\s*(.*)\s*(?<tc2>\[?(?:[0-1][0-9]|2[0-3]|[0-9]):(?:[0-5][0-9]):(?:[0-5][0-9])(?:\.(?:[0-9]{2,3})?\]?))?.*/gm; const matches = str.matchAll(re); for (const match of matches) { console.log(`Start TC:\n${match[1]}\nText:\n${match[2]}\nTC2:\n${match[3]}`); } }

Lo cual no tiene en cuenta las variaciones, desafortunadamente.

Gracias por cualquier sugerencia en la dirección correcta.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El patrón debe estar compuesto de 3 partes:

  • Haga coincidir y capture una marca de tiempo: [ , seguida de dígitos, dos puntos y un punto: \[\d{2}:\d{2}:\d{2}\.\d{2}\]
  • Haga coincidir y capture cualquier carácter que no sea una marca de tiempo: (?:(?!TIMESTAMP).)+ donde TIMESTAMP es el patrón anterior
  • Mire hacia adelante y capture una marca de tiempo: simplemente use el patrón de marca de tiempo anterior

Debe buscar una marca de tiempo en el futuro en lugar de hacerla coincidir normalmente porque es posible que la marca de tiempo en cuestión deba ser parte de la siguiente coincidencia.

Póngalos juntos y obtendrá:

 str = `[09:35:10.00] 1. Lorem ipsum... [09:35:13.11] [09:35:15.14] 2. sed do eiusmod... [09:35:39.20] 3. anim id est laborum... [09:35:43.17]` var re = /(\[\d{2}:\d{2}:\d{2}\.\d{2}\])((?:(?!\[\d{2}:\d{2}:\d{2}\.\d{2}\]).)+)(?=(\[\d{2}:\d{2}:\d{2}\.\d{2}\]))/gs; const matches = str.matchAll(re); for (const match of matches) { console.log(`Start TC:\n${match[1]}\nText:\n${match[2]}\nTC2:\n${match[3]}`); }

O, comentando la expresión regular :

 const pattern = makeExtendedRegExp(String.raw` ( # First capture group: timestamp \[\d{2}:\d{2}:\d{2}\.\d{2}\] ) ( # Second capture group: text (?:(?! # Timestamp pattern again: \[\d{2}:\d{2}:\d{2}\.\d{2}\] ).)+ ) (?=( # Look ahead for and capture the timestamp in 3rd group: # Timestamp pattern again: \[\d{2}:\d{2}:\d{2}\.\d{2}\] )) `, 'gs'); function makeExtendedRegExp(inputPatternStr, flags) { const cleanedPatternStr = inputPatternStr .replace(/(^|[^\\]) *#.*/g, '$1') .replace(/^\s+|\s+$|\n/gm, ''); return new RegExp(cleanedPatternStr, flags); } str = `[09:35:10.00] 1. Lorem ipsum... [09:35:13.11] [09:35:15.14] 2. sed do eiusmod... [09:35:39.20] 3. anim id est laborum... [09:35:43.17]` const matches = str.matchAll(pattern); for (const match of matches) { console.log(`Start TC:\n${match[1]}\nText:\n${match[2]}\nTC2:\n${match[3]}`); }

about 4 years ago · Juan Pablo Isaza 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