Regexp匹配n次出现后的每次出现

Rya*_*ite 1 javascript regex csv

给出一些csv数据,在这样的最终字段中使用未转义的逗号

1, 2, 3, 4, 5
a, b, c, d, foo bar
a, b, c, d, Lorem Ipsum, dolores umbridge, something latin
a, b, c, d, upcoming unescaped commas!, one, two, three, oh no!

我想要一个正则表达式匹配每行第四个逗号之后的所有逗号,这样我就可以用转义的逗号替换它们,

到目前为止,这是我可怕的尝试,它似乎只返回了第一次出现之后的最后一次出现.

^([^,]*,){4}([^,]*(,)[^,]*)*

对于某些情况

那些声称与CSV格式,如部分兼容某些格式ASS认为这是确定有转义逗号的最后一个字段,因为当标题行被解析登记字段的数量.

您可以在ASS规范中看到这一点

格式行指定SSA如何解释所有后续事件行.字段名称必须拼写正确,如下所示: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 最后一个字段将始终为"文本"字段,以便它可以包含逗号.

和这里

每行中的信息字段用逗号分隔.这使得在字符名称和样式名称中使用逗号是非法的(SSA阻止您在这些中使用逗号).它还可以很容易地将SSA脚本的块作为CSV文件加载到电子表格中,并删​​除另一个字幕程序所需的信息列.

为了能够解析这样的文件,假设你已经将数据分成"Chunks",我还需要转义最后一个字段中的所有逗号以使用某些csv-parser.

rev*_*evo 6

您可以匹配直到第4次出现逗号,然后使用以下方法捕获剩余的逗号:

^(?:[^,]*,){1,4}|(,)
Run Code Online (Sandbox Code Playgroud)

由于.replace()方法接受第二个参数的回调,因此您可以在该回调中检查是否存在第一个捕获组.

JS代码:

var str = `1, 2, 3, 4, 5
a, b, c, d, foo bar
a, b, c, d, Lorem Ipsum, dolores umbridge, something latin
a, b, c, d, upcoming unescaped commas!, one, two, three, oh no!`

console.log(
  str.replace(/^(?:[^,]*,){1,4}|(,)/gm, function($0, $1) {
     return $1 ? '\\' + $1 : $0;
  })
);
Run Code Online (Sandbox Code Playgroud)