iOS 正则表达式将非空格字符与 @ 符号后的第一个非单词字符匹配



我很难让我的正则表达式工作。我正在编写一个在评论部分进行标记的应用程序,因此每次出现@符号时,我都需要查看以下文本以从中建立链接。即Instagram和Twitter所做的。

下面是我的正则表达式,

我需要获取符合这些条件的正则表达式的所有出现次数:@ 后跟任何字母数字字符,并在到达空格或其他 @ 符号时结束。

 NSString *searchedString = cellComment.commentText;
 NSRange   searchedRange = NSMakeRange(0, [searchedString length]);
 NSString *pattern = @"@.+[^s]";
 NSError  *error = nil;
 NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error];
 NSArray* matches = [regex matchesInString:searchedString options:0 range: searchedRange];
 for (NSTextCheckingResult* match in matches) {
      NSString* matchText = [searchedString substringWithRange:[match range]];
      for(int i = 0; i< match.numberOfRanges;i++)
      {
           NSRange group1 = [match rangeAtIndex:i];
           NSLog(@"group1: %@%lu", [searchedString substringWithRange:group1],group1.location);
      }
 }

你在最初的发布版本中[^s]过,问题是在 Objective-C 正则表达式模式中反斜杠必须加倍。此外,.+匹配换行符以外的一个或多个字符,这不是您需要的。

您可以使用

NSString *pattern = @"\B@\w\S*\b";

查看正则表达式演示,它匹配

  • B - 非单词边界(@之前必须没有单词字符,如果需要在此类上下文中匹配,请删除)
  • @ - 字面上的@
  • w - 字母数字字符(如果第一个字符应该是字母,请使用p{L},如果要允许字母或数字出现在初始位置,请使用[p{L}d]字符)
  • S* - 零个或多个非空格字符,最多...
  • b - 单词边界。

请注意,Twitter 用户名遵循以下模式:

NSString *pattern = @"@\w+";

w+匹配任何字母数字字符(一个或多个匹配项)。

查看代码的 IDEONE 演示

最新更新