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

时间:2016-01-28 07:23:52

标签: ios regex xcode tagging nsregularexpression

我很难让正则表达式起作用。我正在编写一个在评论部分进行标记的应用程序,因此每次有@符号时,我都需要查看以下文本以创建一个链接。即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);
      }

 }

1 个答案:

答案 0 :(得分:1)

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

您可以使用

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

请参阅regex demo,匹配

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

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

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

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

请参阅IDEONE demo of your code