Estoy tratando de dividir una cadena en una pila/matriz de cadenas en función de una coincidencia de expresiones regulares. La cadena puede tener un icono de Remix incrustado en ella, que extraeré y renderizaré los atributos HTML en función del posicionamiento.
Los nombres de los iconos estarán envueltos por : antes y después. El objetivo es dividir cadenas así:
"Select an option:ri-arrow-down-s-line:" ---> ["Select an option", ":ri-arrow-down-s-line:"]"Download :ri-download-line: or upload :ri-upload-line:" ---> ["Download ", ":ri-download-line:", " or upload ", ":ri-upload-line:"]":ri-download-line:" ---> [":ri-download-line:"] Intenté usar this.label.split(/:ri-.*:/) pero no incluye los nombres de los íconos en la pila de resultados y no funciona con repeticiones. Algo como "Descargar: ri-download-line: o cargar: ri-upload-line:" da una salida de ['Download ', ''] con esto.
/:ri-[^:]*:/ mejora la división de cadenas y tiene en cuenta las repeticiones. Sin embargo, ahora necesito descubrir cómo incluir la expresión regular coincidente en la pila en las posiciones respectivas¿Alguien puede indicarme la dirección correcta?
Puedes usar este refex simple para hacer la división:
/(?=:ri)/g Simplemente se divide cada vez que hay :ri a la derecha.
Tenga en cuenta que usa la bandera global para que pueda coincidir y dividirse en todas las ocurrencias.
Ahora tienes una matriz. Si desea la sintaxis que se muestra en su pregunta, puede usar JSON.stringify en el resultado.
Puede utilizar el grupo de captura en la división /(:ri-[^:]+:)/ para incluirlo en el resultado, luego es posible que deba filtrar los elementos vacíos del resultado de la división:
const Split = s => s.split(/(:ri-[^:]+:)/).filter(Boolean); console.log(Split("Select an option:ri-arrow-down-s-line:")) console.log(Split("Download :ri-download-line: or upload :ri-upload-line:")) console.log(Split(":ri-download-line:"))En lugar de dividir en 1, podría coincidir con ambos.
Por ejemplo:
const label = "Download :ri-download-line: or upload :ri-upload-line:" let arr = label.match(/(:ri-[^:]*:)|[^:]+/g); console.log(arr);