如何重复捕获组?

时间:2015-02-04 09:38:26

标签: ios regex nsregularexpression

我有一个输入字符串,如下所示:

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类的实例 - 不确定这是否是一个有用的信息,它只是我知道NSRegularExpression不支持正则表达式世界的每一个部分。

3 个答案:

答案 0 :(得分:4)

(.+?CS.{2})

你可以直接使用它。参见demo.Grab the group或capture。

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

答案 1 :(得分:1)

将正则表达式更改为,

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

DEMO

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

答案 2 :(得分: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.