Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Search pattern in string using regex in obj-c

I'm working on a string pattern match algorithm. I use NSRegularExpression for finding the matches. For ex: I've to find all words starting with '#' in a string.. Currently I use the following regex function:

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

     return _searchTagRegularExpression;
}

and I use it as below:

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 )
}];

This works properly. But i just want to know if this is the best way. suggest if there's any better alternative...

like image 969
manileo86 Avatar asked Sep 27 '26 22:09

manileo86


1 Answers

Actually your proposed pattern and implementation is quite good:

  • The pattern is quite precise with its use of the (fancy) zero-width negative look behind assertion to make sure you only match at the beginning of a word. It works correctly at the beginning of a string, for example.

  • The implementation reuses the regex object and avoids recompilation of the pattern.

If you wanted me to be nitpicking: You could drop the NSRegularExpressionCaseInsensitive option as your pattern does not use any parts that have a case.

like image 129
Nikolai Ruhe Avatar answered Sep 29 '26 13:09

Nikolai Ruhe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!