我的字符串如下所示:
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)$)
-换行序列,后面不跟bbbbbbb
、aaaaaaa
或ccccccc
以及行的末尾.*
-除换行符之外的任何0+个字符,尽可能多
R
—断线序列bbbbbbb
-字符串(?:R(?!(?:aaaaaaa|ccccccc)$).*)*
-0次或多次R(?!(?:aaaaaaa|ccccccc)$)
-不跟在aaaaaaa
或ccccccc
后面的换行序列和行的末尾.*
-除换行符之外的任何0+个字符,尽可能多
R
—断线序列ccccccc
-字符串