NSRegularExpression枚举匹配字符串的正确用法



我的字符串如下所示:

dog-3
dog-2
dog-1
dog0
aaaaaaa
dog1
dog2
dog3
dog4
bbbbbbb
dog5
dog6
dog7
dog8
ccccccc
dog9
dog10
dog11
aaaaaaa
dog12
dog13
dog14
dog15
bbbbbbb
dog16
dog17
dog18
dog19
ccccccc
dog20
dog21
dog22
dog23

我正在尝试编写一个正则表达式来匹配模式"^aaaaaaa$.+^bbbbb$.+^ ccccccc"这是我的代码,上面描述了str

NSRegularExpression *conflictMarker = [NSRegularExpression regularExpressionWithPattern:@"^aaaaaaa$.+^bbbbbbb$.+^ccccccc"
              options:NSRegularExpressionDotMatchesLineSeparators|NSRegularExpressionAnchorsMatchLines
                error:&error];
[conflictMarker enumerateMatchesInString:str options:0
range:NSMakeRange(0, str.length)
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSRange matchRange = [result range];
NSString *subst = [str substringWithRange:matchRange];
NSInteger a = result.numberOfRanges;
NSLog(@"%ld ", a);
for (NSInteger a = 0; a < result.numberOfRanges; a++) {
NSRange matchRange = [result rangeAtIndex:a];
NSString *subst = [str substringWithRange:matchRange];
NSLog(@"n%@", subst);
}
}];

我对上述代码的期望是收到两场比赛;第一个匹配包含从"dog1"到"dog8"的范围,第二个范围从"dog12"到"dog19",但我只得到了一个从"dog2"到"dog19"的范围。

我在这里做错了什么?我该如何纠正?

提前谢谢。

您可以使用

^aaaaaaa(?:R(?!(?:bbbbbbb|aaaaaaa|ccccccc)$).*)*Rbbbbbbb(?:R(?!(?:aaaaaaa|ccccccc)$).*)*Rccccccc

请参阅regex演示。确保将正则表达式选项更改为options:NSRegularExpressionAnchorsMatchLines,以便此模式正常工作:

NSRegularExpression *conflictMarker = [NSRegularExpression regularExpressionWithPattern:@"^aaaaaaa(?:\R(?!(?:bbbbbbb|aaaaaaa|ccccccc)$).*)*\Rbbbbbbb(?:\R(?!(?:aaaaaaa|ccccccc)$).*)*\Rccccccc"
options:NSRegularExpressionAnchorsMatchLines
error:&error];

详细信息

  • ^-行的开头
  • aaaaaaa-字符串
  • (?:R(?!(?:bbbbbbb|aaaaaaa|ccccccc)$).*)*-0次或多次
    • R(?!(?:bbbbbbb|aaaaaaa|ccccccc)$)-换行序列,后面不跟bbbbbbbaaaaaaaccccccc以及行的末尾
    • .*-除换行符之外的任何0+个字符,尽可能多
  • R—断线序列
  • bbbbbbb-字符串
  • (?:R(?!(?:aaaaaaa|ccccccc)$).*)*-0次或多次
    • R(?!(?:aaaaaaa|ccccccc)$)-不跟在aaaaaaaccccccc后面的换行序列和行的末尾
    • .*-除换行符之外的任何0+个字符,尽可能多
  • R—断线序列
  • ccccccc-字符串

最新更新