【发布时间】:2021-12-05 04:34:51
【问题描述】:
我想仅使用正则表达式拆分管道(|)分隔的文件,并在第 n 个位置提取特定字段。我当前的解决方案工作正常,直到出现空白字段。我无法弄清楚我做错了什么。
样本数据:
asdw|qwe|23344|as||sada||ssss|sdd
我的部分工作解决方案:
^((?:[^|]+\|){3})(?P<error>[^|]+)
https://regex101.com/r/bXvo4T/1
当前解决方案的问题是,当两个连续的分隔符出现而中间没有任何内容时,它会失败,至于位置 4,它应该不返回匹配项,但最终对于第 4 个位置之后的所有出现都没有匹配项。您可以在共享的 regex101 链接中尝试。
【问题讨论】:
-
您使用什么语言?大多数语言都有比使用正则表达式更健壮的 CSV 库。
-
每当你给出一个例子时,请说明你想要的结果。您是否希望在此处返回第 3 和第 4 个管道之间的字符串?感兴趣的管柱必须在管子之间,或者它可以在管子的开头和第一个管子之间,或者在最后一个管子和管子的末端之间。你说你有一个“部分工作的解决方案”。哪方面不满意。请编辑。
-
假设您想要第 3 个管道之后的字符串,如果至少有 4 个管道,则在第 3 和第 4 个管道之间,否则在第 3 个管道之后的字符串。此外,假设 pipe zero 之后的字符串被视为第一个管道之前的字符串,如果没有管道,则视为整个字符串。如果正则表达式引擎支持
\K(如PCRE、Ruby 和其他),并且您指定了第三个管道,例如,您可以将感兴趣的字符串与正则表达式^(?:[^|]*\|){3}\K[^|]+匹配。 Demo... -
... 如链接所示,
\K导致正则表达式引擎将匹配的开头重置为字符串中的当前位置,并从报告的匹配中丢弃所有先前使用的字符. -
@CarySwoveland 更新了我的问题。您的解决方案也有效,您可以将其发布为答案。非常感谢,不知道
\K。
标签: regex csv regex-greedy