NSRegularExpression enumerateMatchesInString 正确用法
NSRegularExpression enumerateMatchesInString correct usage
我的字符串如下所示:
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$.+^bbbbbbb$.+^cccccccc”
这是我的代码,上面描述了 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" 的范围,但我只得到一场比赛,范围从 "dog1" 到 "dog19".
我在这里做错了什么,我该如何纠正?
提前致谢。
您可以使用
^aaaaaaa(?:\R(?!(?:bbbbbbb|aaaaaaa|ccccccc)$).*)*\Rbbbbbbb(?:\R(?!(?:aaaaaaa|ccccccc)$).*)*\Rccccccc
查看正则表达式演示。确保将正则表达式选项更改为 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
- 一个字符串。
我的字符串如下所示:
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$.+^bbbbbbb$.+^cccccccc” 这是我的代码,上面描述了 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" 的范围,但我只得到一场比赛,范围从 "dog1" 到 "dog19".
我在这里做错了什么,我该如何纠正?
提前致谢。
您可以使用
^aaaaaaa(?:\R(?!(?:bbbbbbb|aaaaaaa|ccccccc)$).*)*\Rbbbbbbb(?:\R(?!(?:aaaaaaa|ccccccc)$).*)*\Rccccccc
查看正则表达式演示。确保将正则表达式选项更改为 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
- 一个字符串。