如何重复捕获组?
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})
您不需要将正则表达式放在另一个捕获组中并使其重复一次或多次。只需打印组索引 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群或抓包。
我有一个看起来像这样的输入字符串:
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})
您不需要将正则表达式放在另一个捕获组中并使其重复一次或多次。只需打印组索引 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群或抓包。