如何编写匹配自身重叠单词的正则表达式?

时间:2011-06-06 16:24:47

标签: iphone objective-c regex regexkitlite

我正在尝试在字符串中向前和向后匹配一个单词,但它没有捕获所有匹配。例如,在字符串“AAABAAABAAA”中搜索单词“AB”,我创建并使用regex / AB | BA /,但它只匹配两个“AB”子串,并忽略“BA”子串。

我在iPhone上使用RegexKitLite,但我认为这是一个更普遍的正则表达式问题(我在在线正则表达式测试中看到了相同的行为)。不过,这是我用来枚举匹配的代码:

[@"AAABAAABAAA" enumerateStringsMatchedByRegex:@"AB|BA" usingBlock:
 ^(NSInteger captureCount,
   NSString * const capturedStrings[captureCount],
   const NSRange capturedRanges[captureCount],
   volatile BOOL * const stop) { 
     NSLog(@"%@", capturedStrings[0]);
 }];

输出:

AB
AB

3 个答案:

答案 0 :(得分:1)

我不知道你试过哪个在线测试器,但是http://www.regextester.com/(例如)不会考虑多个匹配的相同字符。在这种情况下,由于ABA与AB匹配,因此不考虑B匹配BA。纯粹猜测RegexKitLite的实现方式类似。

即使您不考虑镜像变体,原始搜索字符串也可能与自身重叠。例如,如果您在ABCABCACBACBA中搜索ABCA | ACBA,您将获得四场比赛中的两场,两个方向的搜索将是相同的。

应该可以逐步找到匹配,但也许不能使用RegexKitLite

答案 1 :(得分:1)

我会说,这不可能在一个回合中。正则表达式匹配给定的模式并“吃掉”匹配的字符。因此,如果您在AB|BA中搜索ABA第一个找到的模式为AB,那么正则表达式会继续搜索第三个A

因此,无法使用相同的正则表达式并使用|运算符找到重叠的模式。

答案 2 :(得分:0)

我不确定你是如何完成我认为你要求的,而不是反转弦并测试两次。

但是,我认为这完全取决于你的目标。如果您只是尝试确定 if 模式是否在字符串中向后或向前发生,而不是 如何发生,那么您可以执行以下操作:< / p>

ABA?|BAB?

?使|每一侧的最后一个字符可选。对于AAABAAABAAA,它会发现ABA两次。在AB的情况下,它会找到AB,而在BA的情况下,它会找到BA

这是测试用例... http://regexhero.net/tester/?id=a387ae0a-1707-4d9e-856b-ebe2176679bb