regex 正则表达式匹配多个子组?[副本]

icnyk63a  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(64)

此问题已在此处有答案

Replace comma between quotes in CSV with Regex(3个答案)
15天前关闭。
给定以下字符串:

text,text,text,text
text,"text,text",text,text
text,text,text,text
text,"text,text",text,"text,text"

如何只匹配引号之间的逗号?

上下文:我试图从CSV文件中“清理”这些数据,这样我就可以在JS中正确地用.split(",")分割行。

rryofs0p

rryofs0p1#

我强烈建议使用像csv-parser这样的NPM包,它应该可以处理CSV文件的所有边缘情况。然而,如果这不是一个选项,你可以使用这个正则表达式,它可以解析你的示例输入,但处理所有用例,比如转义引号:

(?<=^|,)("([^"]*)"|[^,]*)(?=,|$)
说明:
  • (?<=^|,):前一个字符应该是逗号或行首
  • ("([^"]*)"|[^,]*):捕获组1应该是:
  • "([^"]*)":用双引号括起来,字符串中没有"
  • ([^"]*):捕获组2仅捕获""中的字符串
  • [^,]*:字符串中没有双引号,也没有,
  • (?=,|$):下一个字符应该是逗号或行尾

示例实现:

function simpleCSVParser(csv) {
    const re = /(?<=^|,)("([^"]*)"|[^,]*)(?=,|$)/g,
        matches = csv.split('\n').map(csvLine => csvLine.matchAll(re)),
        csvData = [];
    for (let matchLine of matches) {
        csvData.push([]);
        for (let match of matchLine) {
            // Push match group 2 (double quoted string with quotes removed) to
            // the last line of the CSV if it exists, otherwise push match group 1
            csvData[csvData.length - 1].push(match[2] ?? match[1]);
        }
    }
    return csvData;
}

通过您的输入:

text,text,text,text
text,"text,text",text,text
text,text,text,text
text,"text,text",text,"text,text"

函数的输出是:

[
  ["text", "text", "text", "text"],
  ["text", "text,text", "text", "text"],
  ["text", "text", "text", "text"],
  ["text", "text,text", "text", "text,text"]
]

其他方案:

如果你想要一个正则表达式来处理更多的边缘情况,我建议看看这个问题:Regex to split a CSV

相关问题