iOS 正则表达式匹配非空白字符,直到 @ 符号后的第一个非单词字符

iOS regex matching non-whitespace characters up to first non-word character after @ symbol

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

下面是我的正则表达式,我需要获取符合这些条件的正则表达式的所有出现:@ 后跟任何字母数字字符,并在到达 space 或另一个 @ 符号时结束。

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

 }

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

你可以使用

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

看到regex demo,它匹配

  • \B - non-word 边界(在 @ 之前不能有单词字符,如果需要在这样的上下文中匹配,请删除)
  • @ - 文字 @
  • \w - 一个字母数字字符(如果第一个应该是字母,则使用 \p{L},如果您希望在初始位置允许一个字母或数字,则使用 [\p{L}\d]
  • \S* - 零个或多个 non-whitespace 个字符,最多...
  • \b - 单词边界。

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

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

\w+ 匹配任何字母数字字符(出现一次或多次)。

IDEONE demo of your code