Bagus dalam teori, buruk dalam praktik
Dengan CSV saya akan menganggap Anda maksud konvensi seperti yang dijelaskan dalam RFC 4180 .
Sementara mencocokkan data CSV dasar itu sepele:
"data", "more data"
Catatan: BTW, jauh lebih efisien untuk menggunakan fungsi .split ('/ n'). Split ('"') untuk data yang sangat sederhana dan terstruktur dengan baik seperti ini. Ekspresi Reguler berfungsi sebagai NDFSM (Non-Deterministic Finite) State Machine) yang membuang banyak waktu untuk mundur begitu Anda mulai menambahkan case edge seperti escape chars.
Misalnya, inilah string pencocokan ekspresi reguler paling komprehensif yang saya temukan:
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.
"""
Ini secara wajar menangani nilai kuotasi tunggal dan ganda, tetapi tidak pada baris baru dalam nilai, lolos dari kutipan, dll.
Sumber: Stack Overflow - Bagaimana saya bisa mengurai string dengan JavaScript
Ini menjadi mimpi buruk begitu kasus tepi umum diperkenalkan seperti ...
"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
Kasus tepi newline sebagai nilai saja sudah cukup untuk memecahkan 99,9999% dari parser berbasis RegEx yang ditemukan di alam liar. Satu-satunya alternatif 'masuk akal' adalah menggunakan pencocokan RegEx untuk karakter kontrol / non-kontrol dasar (yaitu terminal vs non-terminal) yang dipasangkan dengan mesin keadaan yang digunakan untuk analisis tingkat yang lebih tinggi.
Sumber: Pengalaman atau dikenal sebagai rasa sakit dan penderitaan yang luas.
Saya adalah penulis jquery-CSV , satu-satunya parser CSV yang berbasis javascript, sepenuhnya sesuai RFC, di dunia. Saya telah menghabiskan waktu berbulan-bulan menangani masalah ini, berbicara dengan banyak orang cerdas, dan mencoba satu ton jika implementasi yang berbeda termasuk 3 penulisan ulang penuh dari mesin parser inti.
tl; dr - Moral dari cerita ini, PCRE sendiri menyebalkan untuk menguraikan apa pun kecuali tata bahasa reguler yang paling sederhana dan ketat (yaitu Tipe-III). Meskipun, ini berguna untuk tokenizing terminal dan string non-terminal.