Поиск шаблона в строке с помощью регулярных выражений в obj-c - PullRequest
3 голосов
/ 03 апреля 2012

Я работаю над алгоритмом сопоставления с образцом строки.Я использую NSRegularExpression для поиска совпадений.Например: я должен найти все слова, начинающиеся с '#' в строке. В настоящее время я использую следующую функцию регулярного выражения:

static NSRegularExpression *_searchTagRegularExpression;
static inline NSRegularExpression * SearchTagRegularExpression() 
{
     if (!_searchTagRegularExpression) 
     {
          _searchTagRegularExpression = [[NSRegularExpression alloc] 
                                          initWithPattern:@"(?<!\\w)#([\\w\\._-]+)?"
                                                  options:NSRegularExpressionCaseInsensitive 
                                                    error:nil];
     }

     return _searchTagRegularExpression;
}

и использую ее следующим образом:

NSString *searchString = @"Hi, #Hash1 #Hash2 #Hash3...";
NSRange searchStringRange = NSMakeRange(0, searchString.length);
NSRegularExpression *regexp = SearchTagRegularExpression();
[regexp enumerateMatchesInString:searchString 
                         options:0 
                           range:searchStringRange 
                      usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
{       
  // comes here for every match with range ( in this case thrice )
}];

Это работает правильно.Но я просто хочу знать, если это лучший способ.предположить, есть ли лучшая альтернатива ...

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

На самом деле ваш предложенный шаблон и реализация довольно хороши:

  • Шаблон довольно точен с использованием (причудливого) отрицательного взгляда нулевой ширины за утверждением, чтобы убедиться, что вы толькосовпадать в начале слова.Он работает правильно в начале строки, например.

  • Реализация повторно использует объект regex и избегает перекомпиляции шаблона.

Если вы хотите, чтобы я придирался: вы можете отказаться от опции NSRegularExpressionCaseInsensitive, так как в вашем шаблоне не используются детали, которые имеют кейс.

0 голосов
/ 03 апреля 2012

То, что вы делаете, это хороший способ наверняка. Вы тоже можете это сделать,

for(NSString *match in [string componentSeperatedByString:@" "])
    {
      if([match hasPrefix:@"#"])
       {
         //do what you like.
        }
     }
...