【问题标题】:How to parse comma separated line correctly with regex如何使用正则表达式正确解析逗号分隔的行
【发布时间】:2017-11-14 22:15:27
【问题描述】:

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

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

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

预期结果:

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

匹配数为逗号数+1。

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

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

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

是否可以在不更正代码结果的情况下修复正则表达式,使匹配数为值数(逗号 + 1)?

【问题讨论】:

  • 您使用的语言是否有 regex.Split?
  • 使用([^,\v]+|(?<=,))(?=,|$)

标签: regex csv


【解决方案1】:

简介

您的正则表达式似乎在某些位置不匹配任何字符并作为一种断言工作(断言您的组中没有字符匹配并且后面没有逗号,,根据您的正则表达式这是完全有效的)。

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

解决此问题的最佳方法是使用字符串函数拆分, 上的字符串,但此方法也有效。


代码

See regex in use here

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

说明

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

【讨论】:

  • 谢谢,你能分享一些关于这种情况下的前瞻的知识吗?
  • 不客气!积极的展望是确保前面的标记后面的内容与逗号或行尾匹配。
猜你喜欢
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多