【问题标题】:capturing multiple groups of characters from a single line从单行捕获多组字符
【发布时间】:2019-10-17 06:54:32
【问题描述】:

我需要一个单行正则表达式来满足将 0 捕获到多个组的需求。这些行总是以一个“{”开头,然后是一个数字,然后是一个冒号......即在正则表达式中{%d: 然后继续捕获直到它碰到右大括号}

下面的一些示例行:

{1:23842039423409} 
{2:JSHDF98343SSDSDASASDSASDSAD993}{1:JSHDF98343993}
{2:JSHDF98343993}{1:23842039423409}{1:BLHASD9293}
{2:{JSHDF98343993}{1:23842039423409}{1:BLHASD9293}
{4missing_colon_not_to_be_captured}
{missing_number_not_to_be_captured}{2:CAPTURE_THIS}
  • 第 1 行应该有 1 个组被捕获,
  • 第 2 行应该有 2 个组被捕获,
  • 第3行应该抓到3组,
  • 第 4 行应该捕获 3 个组,
  • 第 5 行没有捕获任何内容,
  • 第 6 行有 1 个组被捕获。

通过为多个组重复正则表达式,我得到了几乎可以工作的东西(有点),但不认为这是解决这个问题的正确方法,但我正在努力理解如何让它完全工作。

([{%d:][^}]*})([{%d:][^}]*})

将捕获一条线上有两个以上的东西要捕获的组,但显然只会捕获前 2 组,即第 2 行中的 2 组,第 3 行中的前 2 组(但不是第 3 组)、第 4 行的前 2 组(但不是第 3 组)等。

我尝试了其他一些变体,但均未成功。感谢您的帮助!

【问题讨论】:

  • 您的商品模式必须是{\d:[^}]*}{\d+:[^}]*}。然后,您不能拥有任意数量的捕获组,它们的数量始终由模式固定。因此,您可以使用 {\d+:[^}]*} 匹配所有出现次数,或者添加您认为必要的任意数量的可选组,以支持它们的最大出现次数,例如 ({\d+:[^}]*})({\d+:[^}]*})?({\d+:[^}]*})?({\d+:[^}]*})?({\d+:[^}]*})?
  • 您的正则表达式使用什么语言/工具?
  • 谢谢@Wiktor 会试试的。
  • @TimBiegeleisen 我正在使用一个名为“Paxata”的数据准备工具,我相信它实现了 javascript 正则表达式。

标签: regex


【解决方案1】:

试试这个

{\d:.+?}

参见https://regexr.com/4n0l1的描述

【讨论】:

  • 这可以解决所描述的问题,但是@TimBiegeleisen 的评论实际上解决了我的问题({\d+:[^}]*})({\d+:[^}]*})?({\d+:[^}]*})?({\d+:[^}]*})?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多