Tengo un conjunto de datos que incluye notas fechadas, todas concatenadas, como en el siguiente ejemplo. Suponga que la fecha siempre viene al principio de su nota. Me gustaría dividirlos en notas individuales. He usado una anticipación positiva para poder mantener el delimitador (la fecha).
Esto es lo que estoy haciendo:
const notes = "[3/28- A note. 3/25- Another note. 3/24- More text. 10/19- further notes. [10/18- Some more text.]" const pattern = /(?=\d{1,2}\/\d{1,2}[- ]+)/g console.log(notes.split(pattern))
y el resultado es
[ '[', '3/28- A note. ', '3/25- Another note. ', '3/24- More text. ', '1', '0/19- further notes. [', '1', '0/18- Some more text.]' ]
El patrón \d{1,2}
coincide con 10/19
y 0/19
, por lo que se divide antes de ambos. En cambio, me gustaría tener
[ '[', '3/28- A note. ', '3/25- Another note. ', '3/24- More text. ', '10/19- further notes. [', '10/18- Some more text.]' ]
(Puedo manejar los corchetes extraños más tarde).
¿Cómo puedo lograr esta división con expresiones regulares o cualquier otra técnica?
Para obtener el resultado deseado, puede anteponer un límite de palabra en la búsqueda anticipada y puede omitir el signo más al final del patrón.
(?=\b\d{1,2}\/\d{1,2}[- ])
Demostración de expresiones regulares
const notes = "[3/28- A note. 3/25- Another note. 3/24- More text. 10/19- further notes. [10/18- Some more text.]" const pattern = /(?=\b\d{1,2}\/\d{1,2}[- ])/g console.log(notes.split(pattern))
Evitaría split()
aquí y en su lugar usaría match()
:
var notes = "[3/28- A note. 3/25- Another note. 3/24- More text. 10/19- further notes. [10/18- Some more text.]"; var matches = notes.match(/\[?\d+\/\d+\s*-\s*.*?\.\]?/g); console.log(matches);
Puede realizar una limpieza adicional de los corchetes iniciales/posteriores utilizando expresiones regulares, por ejemplo
var input = "[10/18- Some more text.]"; var output = input.replace(/^\[|\]$/, "");
Pruebe .replaceAll()
y esta expresión regular:
/(\[?\d{1,2}\/\d{1,2}\-.+?)/ // Replacement "\n$1"
Figura I - Regex
Segmento | Descripción |
---|---|
(\[? | Comience el grupo de captura: haga coincidir el literal "[" cero o una vez |
\d{1,2}\/ | hacer coincidir un dígito una o dos veces y un literal "/" |
\d{1,2}\- | hacer coincidir un dígito una o dos veces y un literal "-" |
.+?) | hacer coincidir cualquier cosa con cualquier cantidad de veces "perezosamente" - finalizar el grupo de captura |
Figura II - Reemplazo
Segmento | Descripción |
---|---|
\n | Nueva línea |
$1 | Todo coincidió en el grupo de captura ( ... ) |
const notes = "[3/28- A note. 3/25- Another note 3/24- More text. 10/19- further notes [10/18- Some more text.]"; const rgx = new RegExp(/(\[?\d{1,2}\/\d{1,2}\-.+?)/, 'g'); let result = notes.replaceAll(rgx, "\n$1"); console.log(result);