如何正确解析逗号分隔行与正则表达式

时间:2017-11-14 22:15:28

标签: regex csv

尝试使用正则表达式解析逗号分隔的行,但结果不一致:

正则表达式:([^,]*),?

实际值在匹配组1中(不包括逗号)。

预期结果:

a,,b  -> 3 matches
a,,b, -> 4 matches
a,,,b -> 4 matches

匹配数是逗号+ 1。

问题是最后的正则表达式匹配,即使没有逗号,所以得到:

a,,b  -> 4 matches
a,,b, -> 4 matches

两者都返回4个匹配,即使这些行具有不同数量的值。

是否可以修复正则表达式,以便匹配的数量是值(逗号+ 1)而不更正代码中的结果?

1 个答案:

答案 0 :(得分:1)

看起来你的正则表达式不匹配某些位置的任何字符并且作为一种断言(断言你的组中没有匹配的字符而没有逗号,,这完全有效,根据你的正则表达式。

这个答案是一个 fix ,它允许你匹配任何非逗号,字符中的一个或多个,或者用于零宽度匹配的断言同时断言该位置前面有一个逗号,

最好的解决方法是使用字符串函数将字符串拆分为,,但此方法也可以。

代码

See regex in use here

([^,\v]+|(?<=,))(?=,|$)

说明

  • ([^,\v]+|(?<=,))将以下任一项捕获到捕获组1中
    • [^,\v]+匹配集,\v中不存在的任何字符中的一个或多个。这与字面上的逗号,或垂直空白字符\v(例如换行符)匹配
    • (?<=,)匹配前一个标记(使用正向后看)是逗号,
    • 的位置
  • (?=,|$)确保以下内容的正面预测是字面上的逗号,或字符串的结尾$