Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

171
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda