Digamos que tengo una cadena __f__g_f_
¿Cómo puedo lograr dividirlo en una matriz como ['__','f','__','g','_','f','_']
Esto debería hacer:
const str = '__f__g_f_'
const parts = str.split(/([az]+)/)
console.log(parts)
En lugar de usar .split() , puede usar .match() con un grupo coincidente en la expresión regular, le dará una matriz de todas sus coincidencias deseadas.
const str = '__f__g_f_'
const parts = str.match(/(_+)|([az]+)/g)
console.log(parts);
[
"__",
"f",
"__",
"g",
"_",
"f",
"_"
]
La división funciona con una complejidad de tiempo O(N) para que pueda escribir su propia implementación y sea más legible y fácil de mantener
const s = "__f__g_f_"
const array = []
let buffer = ""
for (let i = 0; i < s.length; i++) {
if (s[i] === "_") {
buffer += s[i]
continue
}
if (buffer.length > 0) {
array.push(buffer)
buffer = ""
}
array.push(s[i])
}
if (buffer.length > 0) {
array.push(buffer)
}
console.log(array)
Editar:
(/([az]+)/) es elegante pero siempre estará en la piel de otros devops. ¿Qué significa (/([az]+)/) de un vuezo? Regex es como un programa compilado, código de máquina. a menos que todos los devops sean expertos en expresiones regulares, no están autodocumentados. Requieren ser comentados. Y puede haber errores en ellos, ¿cómo puedes confiar en /([az]+)/ si realmente funciona sin ejecutar el código? Ver código legible por humanos siempre es preferible. Y finalmente, puede que se sorprenda de que las expresiones regulares pueden tener una complejidad de tiempo extraña, a veces saltan a exponencial. No sabes cómo se implementan. Aquí, una implementación simple, simple y legible es 100% más rápida que la expresión regular.
console.time('regex');
for (let i = 0; i < 100_000_000; i++) {
const str = '__f__g_f_'
const parts = str.split(/([az]+)/)
}
console.timeEnd("regex")
console.time('plain_fast');
for (let i = 0; i < 100_000_000; i++) {
const s = "__f__g_f_"
const array = []
let buffer = ""
for (let i = 0; i < s.length; i++) {
if (s[i] === "_") {
buffer += s[i]
continue
}
if (buffer.length > 0) {
array.push(buffer)
buffer = ""
}
array.push(s[i])
}
if (buffer.length > 0) {
array.push(buffer)
}
}
console.timeEnd("plain_fast")
regex: 10540.700ms
plain_fast: 4556.500ms