如何重复捕获组?

How do I repeat a capturing group?

我有一个看起来像这样的输入字符串:

HLI6Ch60000Ch500C0Ch46400Ch30000Ch21888Ch10E79CS07LCU3Ch37880Ch27800Ch16480CS8CA00000000000000000000

现在我不关心最后一个字母 A 后面的部分,它永远是 A 并且正好是 20 个对我没有用的数字。但是,我确实需要最后一个字母 A 之前的部分,理想情况下,我需要将它分成两个不同的捕获,就像这样:

1: HLI6Ch60000Ch500C0Ch46400Ch30000Ch21888Ch10E79CS07
2: LCU3Ch37880Ch27800Ch16480CS8C

识别这些匹配项的唯一方法是它们以字符 CS 结尾,后跟两个十六进制字符。我认为像 (.+?CS.{2})+(或 (.+?CS[[:xdigit:]]{2})+)这样的正则表达式可以完成这项工作,但是当在 www.regex101.com 上尝试时,它只捕获最后一组并给出以下警告:

注意:重复捕获组只会捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组代替

我认为这表明我应该使用像 ((.+?CS.{2})+) 这样的正则表达式,我的意思是——当然,现在我得到了两个捕获,但它们看起来像这样:

1: HLI6Ch60000Ch500C0Ch46400Ch30000Ch21888Ch10E79CS07LCU3Ch37880Ch27800Ch16480CS8C
2: LCU3Ch37880Ch27800Ch16480CS8C

意思是第一个……比我希望的稍长。如果它有任何帮助,我应该指出最终的正则表达式将成为 iOS 应用程序的一部分,因此将使用 NSRegularExpression class 的实例 - 不确定这是不是完全有用的信息,只是我知道 NSRegularExpression 并不支持正则表达式世界的每个部分。

将您的正则表达式更改为,

(.+?CS[[:xdigit:]]{2})

DEMO

您不需要将正则表达式放在另一个捕获组中并使其重复一次或多次。只需打印组索引 1 即可获得所需的输出。

看来你根本不需要捕获组:

(?:(?!CS[0-9A-F]{2}).)+CS[0-9A-F]{2}

将匹配所有以 CS + 2 个十六进制数字结尾的字符串。

测试一下live on regex101.com

解释:

(?:                # Start a group.
 (?!CS[0-9A-F]{2}) # Make sure we can't match CSff here,
 .                 # if so, match any character.
)+                 # Do this at least once.
CS[0-9A-F]{2}      # Then match CSff.
(.+?CS.{2})

可以直接使用this.Seedemo.Grab群或抓包。

https://regex101.com/r/vD5iH9/68