Nizza in der Theorie, schrecklich in der Praxis
Mit CSV meine ich die in RFC 4180 beschriebene Konvention .
Während der Abgleich grundlegender CSV-Daten trivial ist:
"data", "more data"
Hinweis: Übrigens ist die Verwendung der Funktion .split ('/ n') .split ('"') für sehr einfache und gut strukturierte Daten wie diese wesentlich effizienter. Reguläre Ausdrücke funktionieren als NDFSM (Non-Deterministic Finite) State Machine), die viel Zeit für das Zurückverfolgen verschwendet, sobald Sie Kantenfälle wie Escape-Zeichen hinzufügen.
Zum Beispiel ist hier die umfassendste Zeichenfolge für reguläre Ausdrücke, die ich gefunden habe:
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.
"""
Werte in einfachen und doppelten Anführungszeichen, aber keine Zeilenumbrüche in Werten, Anführungszeichen usw. werden angemessen behandelt.
Quelle: Stapelüberlauf - Wie kann ich einen String mit JavaScript analysieren?
Es wird ein Albtraum, sobald die gängigen Randfälle eingeführt werden wie ...
"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
Der Newline-as-Value-Edge-Fall allein reicht aus, um 99,9999% der in der Natur gefundenen RegEx-basierten Parser zu brechen. Die einzige "vernünftige" Alternative ist die Verwendung des RegEx-Abgleichs für die Tokenisierung von Basissteuerungs- / Nichtsteuerungszeichen (dh Terminal vs. Nicht-Terminal) in Kombination mit einer Zustandsmaschine, die für die Analyse auf höherer Ebene verwendet wird.
Quelle: Erfahrung, die sonst als starke Schmerzen und Leiden bekannt ist.
Ich bin der Autor von jquery-CSV , dem einzigen Javascript-basierten, vollständig RFC-konformen CSV-Parser der Welt. Ich habe Monate damit verbracht, dieses Problem anzugehen, mit vielen intelligenten Leuten zu sprechen und eine Menge verschiedener Implementierungen auszuprobieren, einschließlich dreier vollständiger Neuschreibungen der Core-Parser-Engine.
tl; dr - Moral der Geschichte, PCRE allein saugt für das Parsen alles andere als die einfachsten und strengsten regulären (dh Typ-III) Grammatiken. Es ist jedoch nützlich, um terminale und nicht terminale Zeichenfolgen zu kennzeichnen.