簡體   English   中英

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$.+^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”的范圍,但我只得到一個范圍從“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)$) - 一個換行序列,后面沒有bbbbbbbaaaaaaaccccccc和行尾
    • .* - 除換行符以外的任何 0+ 個字符,盡可能多
  • \R - 換行序列
  • bbbbbbb - 一個字符串
  • (?:\R(??(:.aaaaaaa|ccccccc)$).*)* - 0 次或更多次
    • \R(??(::aaaaaaa|ccccccc)$) - 一個換行序列,后面沒有aaaaaaaccccccc和行尾
    • .* - 除換行符以外的任何 0+ 個字符,盡可能多
  • \R - 換行序列
  • ccccccc - 一個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM