0

我正在尝试在字符串中向前和向后匹配一个单词,但它没有捕获所有匹配项。例如,在字符串“AAABAAABAAA”中搜索单词“AB”,我创建并使用正则表达式 /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
4

3 回答 3

1

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

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

应该可以逐步找到匹配项,但可能无法使用 RegexKitLite

于 2011-06-06T19:11:25.280 回答
1

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

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

于 2011-06-06T19:33:57.570 回答
0

我不确定您如何在不反转字符串并进行两次测试的情况下完全完成我认为您所要求的。

但是,我想这取决于你到底在追求什么。如果您只是试图确定模式是向后还是向前出现在字符串中,而不是如何发生,那么您可以执行以下操作:

ABA?|BAB?

使?最后一个字符在 . 的每一侧都是可选的|。在 的情况下AAABAAABAAA,它会找到ABA两次。在AB它会找到的情况下,在它会找到的AB情况下。BABA

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

于 2011-06-06T18:02:46.523 回答