NSRegularExpression enumerateMatchesInString правильное использование - PullRequest
1 голос
/ 21 апреля 2020

Моя строка выглядит следующим образом:

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», но я получаю только 1 матч с диапазоном от «dog1» до «dog19».

Что я делаю что-то не так и как я могу это исправить?

Заранее спасибо.

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете использовать

^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 - строка.
...