首頁 >web前端 >js教程 >如何使用 JavaScript 中的正規表示式解析帶引號欄位中嵌入逗號的 CSV 字串?

如何使用 JavaScript 中的正規表示式解析帶引號欄位中嵌入逗號的 CSV 字串?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-04 16:45:12941瀏覽

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

基於正規表示式的CSV 字串解析

問題陳述:

解析帶引號的值中嵌入號的CSV 字串,同時忽略引號外的逗號。

解決方案概述:**

要正確解析可能包含帶轉義字元的帶引號值的 CSV 字串,有必要逐個字元地遍歷該字串。使用兩個正規表示式:

CSV 驗證正規表示式:

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

此正規表示式確保輸入字串遵循定義的CSV 格式,其中:

  • 值可以是單引號、雙引號或不含引號。
  • 帶引號的值可能包含轉義字元。
  • 逗號用作分隔符號。

值解析正規表示式:

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

此正規表示式一次從CSV 字串中提取一個值,考慮與驗證正規表示式相同的規則。它處理帶引號的值並刪除轉義字元。

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;
}

範例用法:**

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

以上是如何使用 JavaScript 中的正規表示式解析帶引號欄位中嵌入逗號的 CSV 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn