【问题标题】:Capturing a repeated group vs repeating a capturing group in the middle of a complex regex捕获重复组与在复杂正则表达式中间重复捕获组
【发布时间】:2017-04-01 04:14:57
【问题描述】:

首先:Iknowthisquestionhasbeenbeatentodeath.

第二:我查看了过去几年我能想到的所有资源(在线编辑、RexEggregular-expressions.info 等...),但我仍然无法掌握这部分正则表达式。无论我使用什么正则表达式,它似乎都不适合我。

现在家务已经不碍事了:

我有大量文本需要从中提取一些我认为 Regex 非常适合的数据。

文字如下:

2017-03-31 09:41:18 EDT [12708-4] 参数:$1 = '0',$2 = 'ON',$3 = 'ON'

很明显,我想要$1$2$3 的值。这个特殊的例子有 3 个变量,但通常在 1 到 15 之间。

我想要一个能够捕获以下内容的正则表达式:

  1. $1
  2. '0'
  3. $2
  4. '开'
  5. $3
  6. '开'

这是我的正则表达式,它匹配第一组:

\d{4}.+\[[\d-]*\].+?parameters:\s((\$\d+)\s?=\s?(['\d+\w+]+))

但是加号、括号和逗号的组合不会产生任何接近我想要的东西。即使我从字符串中删除逗号并将它们卡在一起,我也无法捕捉到它。

这家伙什么都捕捉到了,但是这些组没有意义:

\d{4}.+\[[\d-]*\].+?parameters:\s(((\$\d+)\s?=\s?(['\d+\w+]+),?\s?)+)

如果文本被我不关心的字符分隔,有人可以在这里结束我的痛苦并向我解释如何在正则表达式中捕获重复的文本吗?

【问题讨论】:

  • 你可能想看看\G在该位置匹配,上一场匹配结束。 (?:\G(?!^),|parameters:)\s+(\$\d+) = '(\w+)' 应该是您正在寻找的东西。
  • 我也无法让那个工作。还是只抓到一个
  • 尝试多个匹配/捕获 Sebastian 提及的一些修改模式:(?:\G(?!^),|parameters:)\s*(\$\d+)\s*=\s*'([^']+)'\s*。它不会为您提供 6 个组,因为只能有与模式中定义的一样多的组。它将给出 3 个匹配 x 2 个组。如果这种方法不是您所需要的,那么您就无法使用纯正则表达式来获得它。编程语言是什么?

标签: regex pcre


【解决方案1】:

我建议你使用来正则表达式来提取像这样(\$\d) = '(.+?)'example 的每个值集

然后您可以循环遍历所有匹配项。第 1 组将是标签(即 $1),第 2 组将是值(即 0)


只是一个我认为值得一提的小警告:“重复捕获组只会捕获最后一次迭代。如果您对重复组不感兴趣,请在重复组周围放置一个捕获组以捕获所有迭代或使用非捕获组数据”(如 regex101 所述)

【讨论】:

  • 这个问题还有很多不相关的东西,使我无法单独捕获两个组。我知道它只会捕获最后一次迭代。我尝试通过在重复组周围放置一个捕获组来解决它,但它不起作用。
猜你喜欢
  • 2017-09-13
  • 2011-03-11
  • 2017-01-07
  • 2019-12-19
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多