Agradable en teoría, terrible en la práctica.
Por CSV voy a asumir que te refieres a la convención como se describe en RFC 4180 .
Si bien la coincidencia de datos CSV básicos es trivial:
"data", "more data"
Nota: Por cierto, es mucho más eficiente usar una función .split ('/ n'). Split ('"') para datos muy simples y bien estructurados como este. Las expresiones regulares funcionan como un NDFSM (finito no determinista) State Machine) que pierde mucho tiempo retrocediendo una vez que comienza a agregar casos extremos como caracteres de escape.
Por ejemplo, aquí está la cadena de coincidencia de expresiones regulares más completa que he encontrado:
re_valid = r"""
# Validate a CSV string having single, double or un-quoted values.
^ # Anchor to start of string.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
(?: # Zero or more additional values
, # Values separated by a comma.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
)* # Zero or more additional values
$ # Anchor to end of string.
"""
Maneja razonablemente valores de comillas simples y dobles, pero no líneas nuevas en valores, comillas escapadas, etc.
Fuente: Desbordamiento de pila: ¿cómo puedo analizar una cadena con JavaScript?
Se convierte en una pesadilla una vez que se introducen los casos límite comunes como ...
"such as ""escaped""","data"
"values that contain /n newline chars",""
"escaped, commas, like",",these"
"un-delimited data like", this
"","empty values"
"empty trailing values", // <- this is completely valid
// <- trailing newline, may or may not be included
El caso de borde de nueva línea como valor solo es suficiente para romper el 99.9999% de los analizadores basados en RegEx encontrados en la naturaleza. La única alternativa "razonable" es utilizar la coincidencia RegEx para la tokenización básica de caracteres de control / sin control (es decir, terminal versus no terminal) combinada con una máquina de estado utilizada para análisis de nivel superior.
Fuente: Experiencia conocida también como dolor y sufrimiento extensos.
Soy el autor de jquery-CSV , el único analizador CSV basado en javascript, totalmente compatible con RFC en el mundo. He pasado meses abordando este problema, hablando con muchas personas inteligentes y probando un montón si diferentes implementaciones incluyen 3 reescrituras completas del motor del analizador principal.
tl; dr - Moraleja de la historia, PCRE solo apesta para analizar cualquier cosa menos las gramáticas regulares más simples y estrictas (es decir, Tipo III). Aunque, es útil para tokenizar cadenas terminales y no terminales.