Bom em teoria, terrível na prática
Por CSV , vou assumir que você quer dizer a convenção conforme descrito na RFC 4180 .
Embora a correspondência de dados CSV básicos seja trivial:
"data", "more data"
Nota: BTW, é muito mais eficiente usar uma função .split ('/ n'). Split ('"') para dados muito simples e bem estruturados como este. Expressões regulares funcionam como um NDFSM (finito não determinístico) State Machine) que desperdiça muito tempo retornando quando você começa a adicionar casos extremos, como caracteres de escape.
Por exemplo, aqui está a string de correspondência de expressão regular mais abrangente que eu encontrei:
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.
"""
Ele lida razoavelmente com valores entre aspas simples e duplas, mas não com novas linhas de valores, aspas escapadas, etc.
Origem: Estouro de Pilha - Como posso analisar uma string com JavaScript
Torna-se um pesadelo quando os casos comuns são apresentados 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
Somente o caso de nova linha como valor é suficiente para quebrar 99,9999% dos analisadores baseados em RegEx encontrados na natureza. A única alternativa "razoável" é usar a correspondência RegEx para tokenização básica de caracteres de controle / não controle (ou seja, terminal x não terminal) emparelhada com uma máquina de estado usada para análises de nível superior.
Fonte: Experiência conhecida como dor e sofrimento extensos.
Sou o autor do jquery-CSV , o único analisador de CSV baseado em javascript e totalmente compatível com RFC do mundo. Passei meses enfrentando esse problema, conversando com muitas pessoas inteligentes e tentando várias implementações diferentes, incluindo três reescritas completas do mecanismo do analisador de núcleo.
tl; dr - Moral da história, somente o PCRE é péssimo por analisar qualquer coisa, exceto as gramáticas regulares mais simples e estritas (Ie Tipo III). Embora seja útil para tokenizar seqüências de caracteres terminais e não terminais.