我正在尝试在字符串中向前和向后匹配一个单词,但它没有捕获所有匹配。例如,在字符串“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
答案 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