ในทางทฤษฎีดีมากในทางปฏิบัติ
โดยCSVฉันจะถือว่าคุณหมายถึงการประชุมตามที่อธิบายในRFC 4180
ในขณะที่การจับคู่ข้อมูล CSV พื้นฐานเป็นเรื่องเล็กน้อย:
"data", "more data"
หมายเหตุ: BTW มันมีประสิทธิภาพมากขึ้นในการใช้ฟังก์ชัน. split ('/ n'). split ('"') สำหรับข้อมูลที่ง่ายและมีโครงสร้างที่ดีเช่นนี้นิพจน์ทั่วไปทำงานเป็น NDFSM (Non-Deterministic Finite) State Machine) ที่ทำให้เปลืองเวลาในการย้อนรอยมากเมื่อคุณเริ่มเพิ่มเคสแบบขอบอย่างเช่นตัวหลบหลีก
ตัวอย่างเช่นนี่คือสตริงการจับคู่นิพจน์ทั่วไปที่ครอบคลุมที่สุดที่ฉันพบ:
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.
"""
มันมีเหตุผลจัดการค่าที่ยกมาเดี่ยวและคู่ แต่ไม่ขึ้นบรรทัดใหม่ในค่าที่หลีกหนีคำพูด ฯลฯ
ที่มา: Stack Overflow - ฉันจะแยกสตริงด้วย JavaScript ได้อย่างไร
มันกลายเป็นฝันร้ายเมื่อมีการเปิดตัวกล่องใส่ขอบทั่วไป ...
"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
เคสขอบใหม่ตามมูลค่าเพียงอย่างเดียวก็เพียงพอที่จะแยก 99.9999% ของตัวแยกวิเคราะห์ RegEx ตามที่พบในป่า ทางเลือกเดียวที่สมเหตุสมผลคือการใช้การจับคู่ RegEx สำหรับอักขระควบคุม / ไม่ควบคุมขั้นพื้นฐาน (เช่นเทอร์มินัลเทียบกับที่ไม่ใช่เทอร์มินัล) จับคู่กับเครื่องสถานะที่ใช้สำหรับการวิเคราะห์ระดับที่สูงขึ้น
แหล่งที่มา: ประสบการณ์ที่รู้จักกันเป็นอย่างอื่นว่าความเจ็บปวดและความทุกข์ทรมานมากมาย
ฉันเป็นผู้เขียนjquery-CSVซึ่งเป็น javascript เท่านั้นที่ใช้ตัวแยกวิเคราะห์ CSV ที่สอดคล้องกับ RFC อย่างสมบูรณ์ที่สุดในโลก ฉันใช้เวลาหลายเดือนในการแก้ปัญหานี้พูดกับคนที่มีความคิดสร้างสรรค์จำนวนมากและลองใช้งานเป็นตันถ้าการใช้งานที่แตกต่างกันรวมถึงการเขียนใหม่ทั้งหมด 3 ครั้งของตัวแยกวิเคราะห์หลัก
tl; dr - คุณธรรมของเรื่องราว PCRE เพียงอย่างเดียวดูดการแยกวิเคราะห์อะไร แต่ไวยากรณ์ที่ง่ายและเข้มงวด (Ie Type-III) ธรรมดาที่สุด แม้ว่ามันจะมีประโยชน์สำหรับ tokenizing terminal และ non-terminal strings