Почему NSRegularExpression говорит, что в строке «a» есть два совпадения «. *»? - PullRequest
3 голосов
/ 28 июля 2011

Я очень рад, что Лев ввел NSRegularExpression, но я не могу понять, почему шаблон .* соответствует двум вхождениям в строке типа «а» (текст может быть длиннее).

Я использовал следующий код:

NSError *anError = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@".*"
                                                                       options:0
                                                                         error:&anError];
NSString *text = @"a";
NSUInteger counter = [regex numberOfMatchesInString:text
                                            options:0
                                              range:NSMakeRange(0, [text length])];

NSLog([NSString stringWithFormat:@"counter = %u", counter]);

Вывод из консоли:

2011-07-27 22: 03: 27.689 Regex [1930: 707] counter = 2

Может кто-нибудь объяснить, почему это так?

Ответы [ 3 ]

6 голосов
/ 28 июля 2011

Регулярное выражение .* соответствует нулю или более символов. Таким образом, он будет соответствовать пустой строке, а также a, и поэтому есть два совпадения.

2 голосов
/ 28 июля 2011

Слегка удивлен, что это не соответствует 3 раза. Один для "" перед "а", один для "а" и один для "" после "а".

Как уже было отмечено, используйте более точный шаблон; включение якорей (^ и / или $) также может изменить поведение.

Никто не спросил, но зачем вам это делать?

1 голос
/ 28 июля 2011

Документы в выражении NSRegularExpression говорят следующее:

Некоторые регулярные выражения [...] могут успешно соответствовать диапазону нулевой длины, поэтому сравнение полученного диапазонас {NSNotFound, 0} - самый надежный способ определить, было ли совпадение или нет.

Более надежный способ получить только одно совпадение - это изменить выражение на .+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...