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…
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
NSRegularExpressionCaseInsensitiveoption as your pattern does not use any parts that have a case.