【问题标题】:Regex to split and extract value from pipe delimited file正则表达式从管道分隔文件中拆分和提取值
【发布时间】: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


【解决方案1】:

只需将“一个或多个令牌+”与“零个或多个令牌*”交换,因为它看起来卡在两个管道之间没有字符。

我认为以下内容应该可以为您提供所需的结果:

^((?:[^|]*\|){3})(?P<error>[^|]+)

【讨论】:

  • 谢谢,它完成了这项工作。此外,如果您可以添加;如果在所需位置有零标记,如何设置默认值?
  • 我认为这可能超出了模式匹配的能力,并且必须根据您使用它的环境以编程方式处理。不过我很可能会弄错,也许其他人可以摆脱一些进一步的光。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多