Sé que hay preguntas similares disponibles, pero no pude encontrar este caso.
CASO 1: 'a,b,c,d,e'
SALIDA: ["a", "b", "c", "d", "e"]
CASO 2: 'a,b,"c,d", e'
SALIDA: ["a", "b", "c,d", "e"]
CASO 3: 'a,,"c,d", e'
SALIDA: ["a", "", "c,d", "e"]
RegEx que probé: (".*?"|[^",]+)(?=\s*,|\s*$)
Enlace RegEx: https://regex101.com/r/xImG4i/1
Esta expresión regular funciona bien con CASE1 y CASE2 pero está fallando para CASE3. En cambio, funciona para
'a, ,"c,d", e' , dando salida como ["a", " ", "c,d", "e"]
que también está bien, pero también debe funcionar para CASE3.
¡Gracias por adelantado!
Puede tomar caracteres de espacio en blanco opcionales entre 2 comas si se admite una búsqueda posterior.
"[^"]*"|[^\s,'"]+(?:\s+[^\s,'"]+)*|(?<=,)\s*(?=,)Demostración de expresiones regulares
const regex = /"[^"]*"|[^\s,'"]+(?:\s+[^\s,'"]+)*|(?<=,)\s*(?=,)/g; [ `'a,b,c,d,e'`, `'a,b,"c,d", e'`, `'a,,"c,d", e'`, ` xz a,, b, c, "d, e, f", g, h`, `'a, ,"c,d", e'`, ].forEach(s => console.log(s.match(regex)) )Si no desea las comillas dobles, puede usar un grupo de captura con matchAll y buscar el grupo en la devolución de llamada.
const regex = /"([^"]*)"|[^\s,'"]+(?:\s+[^\s,'"]+)*|(?<=,)\s*(?=,)/g; [ `'a,b,c,d,e'`, `'a,b,"c,d", e'`, `'a,,"c,d", e'`, ` xz a,, b, c, "d, e, f", g, h`, `'a, ,"c,d", e'`, ].forEach(s => console.log(Array.from(s.matchAll(regex), m => m[1] ? m[1] : m[0])) )Una solución alternativa que usa una expresión regular para dividir en lugar de hacer coincidir:
/,\s*(?=(?:(?:[^"]*"){2})*[^"]*$)/Esta expresión regular se dividirá en comas seguidas de espacios opcionales si están fuera de las comillas dobles utilizando una búsqueda anticipada para asegurarse de que haya un número par de comillas después de la coma+espacio.
Ejemplo de código:
const re = /,\s*(?=(?:(?:[^"]*"){2})*[^"]*$)/; [ `a,b,"c,d", e`, `a,,"c,d", e`, ` xz a,, b, c, "d, e, f", g, h`, `a, ,"c,d", e`, ].forEach(s => { tok = s.split(re); tok.forEach((e, i) => tok[i] = e.replace(/^"|"$/g, '')) console.log(s, '::', tok); })