Rumah >hujung hadapan web >tutorial js >Bagaimanakah saya boleh menghuraikan rentetan CSV dengan koma terbenam dalam medan petikan menggunakan ungkapan biasa dalam JavaScript?

Bagaimanakah saya boleh menghuraikan rentetan CSV dengan koma terbenam dalam medan petikan menggunakan ungkapan biasa dalam JavaScript?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-04 16:45:12941semak imbas

How can I parse a CSV string with embedded commas in quoted fields using regular expressions in JavaScript?

Penghuraian Rentetan CSV berasaskan Regex

Pernyataan Masalah:

Hilang rentetan CSV dengan koma dibenamkan dalam nilai yang disebut, sambil mengabaikan koma di luar petikan.

Penyelesaian Gambaran Keseluruhan:**

Untuk menghuraikan rentetan CSV dengan betul yang mungkin mengandungi nilai petikan dengan aksara yang dilepaskan, anda perlu menelusuri rentetan aksara demi aksara. Dua ungkapan biasa digunakan:

CSV Validation Regex:

^\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*(?:,\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*)*$

regex ini memastikan bahawa rentetan input mengikut format CSV yang ditentukan, di mana:

  • Nilai boleh disebut petikan tunggal, petikan dua kali atau tidak dipetik.
  • Nilai yang dipetik mungkin mengandungi aksara yang dilepaskan.
  • Koma digunakan sebagai pemisah.

Value Parsing Regex:

(?!\s*$)\s*(?:'([^'\]*(?:\[\S\s][^'\]*)*)'|"([^"\]*(?:\[\S\s][^"\]*)*)"|([^,'"\s\]*(?:\s+[^,'"\s\]+)*)|)\s*(?:,|$)

regex ini mengekstrak satu nilai pada satu masa daripada rentetan CSV, dengan mengambil kira peraturan yang sama sebagai regex pengesahan. Ia mengendalikan nilai yang disebut dan mengalih keluar aksara yang dilarikan.

Pelaksanaan JavaScript:**

function CSVtoArray(text) {
    const re_valid = /^\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*(?:,\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*)*$/;
    const re_value = /(?!\s*$)\s*(?:'([^'\]*(?:\[\S\s][^'\]*)*)'|"([^"\]*(?:\[\S\s][^"\]*)*)"|([^,'"\s\]*(?:\s+[^,'"\s\]+)*))\s*(?:,|$)/g;
    // Return NULL if input string is not well formed CSV string.
    if (!re_valid.test(text)) return null;
    const a = [];                     // Initialize array to receive values.
    text.replace(re_value, // "Walk" the string using replace with callback.
        function(m0, m1, m2, m3) {
            // Remove backslash from \' in single quoted values.
            if      (m1 !== undefined) a.push(m1.replace(/\'/g, "'"));
            // Remove backslash from \" in double quoted values.
            else if (m2 !== undefined) a.push(m2.replace(/\"/g, '"'));
            else if (m3 !== undefined) a.push(m3);
            return ''; // Return empty string.
        });
    // Handle special case of empty last value.
    if (/,\s*$/.test(text)) a.push('');
    return a;
}

Contoh Penggunaan:**

const csvString = "'string, duppi, du', 23, lala";
const result = CSVtoArray(csvString);
console.log(result); // ["string, duppi, du", "23", "lala"]

Atas ialah kandungan terperinci Bagaimanakah saya boleh menghuraikan rentetan CSV dengan koma terbenam dalam medan petikan menggunakan ungkapan biasa dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn