首页 >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