Estoy buscando una manera en Javascript para dividir una cadena en una matriz basada en separadores de "inicio" y "finalización" en lugar de un separador, como lo hace actualmente str.split.
Por ejemplo, si tengo esta cadena:
const str = '{lang}_{cmp_abbrev}_{cmp_type}_{pl_abbrev}_{w}x{h}_d{dv}c{cv}'El resultado de:
str.mySplit('{', '}');seria este:
[ '{lang}', '_', '{cmp_abbrev}', '_', '{cmp_type}', '_', '{pl_abbrev}', '_', '{w}', 'x', '{h}', '_d', '{dv}', 'c', '{cv}' ]Por lo tanto, tomaría en consideración 2 caracteres en lugar de un carácter al determinar cómo debe ocurrir la división de cadenas.
Regex al rescate!
const str = '{lang}_{cmp_abbrev}_{cmp_type}_{pl_abbrev}_{w}x{h}_d{dv}c{cv}' const values = [...str.matchAll(/\w+|\{\w+\}/g)].flat() console.log(values)Array#split puede tomar expresiones regulares con grupos de captura:
'foo{bar}baz{}!'.split(/(\{.*?\})/g) //=> ['foo', '{bar}', 'baz', '{}', '!']Solo tenga en cuenta que se pueden generar cadenas vacías, por ejemplo,
'{foo}bar{baz}'.split(/(\{.*?\})/g) //=> ['', '{foo}', 'bar', '{baz}', ''] '{foo}{bar}{baz}'.split(/(\{.*?\})/g) //=> ['', '{foo}', '', '{bar}', '', '{baz}', '']Pero eso es normal y esperable. Si estos no son deseables, puede filtrarlos:
'{foo}{bar}{baz}'.split(/(\{.*?\})/g).filter(Boolean) //=> ['{foo}', '{bar}', '{baz}']Con su cadena inicial tenemos:
'{lang}_{cmp_abbrev}_{cmp_type}_{pl_abbrev}_{w}x{h}_d{dv}c{cv}'.split(/(\{.*?\})/g).filter(Boolean) //=> ['{lang}', '_', '{cmp_abbrev}', '_', '{cmp_type}', '_', '{pl_abbrev}', '_', '{w}', 'x', '{h}', '_d', '{dv}', 'c', '{cv}']