使用 2 种模式时正则表达式出现问题
Trouble with regular expression when using 2 patterns
我有一个在 UITextView
更新期间调用的方法,可以帮助我检测主题标签和用户名提及,例如。 #hashtag
和 @username
如果我一次只尝试检测一个,此代码将完美运行。我只能检测主题标签,或者只能检测用户名提及。
我正在努力让它同时检测到两者。
这是我的两个正则表达式模式:
- 标签:
#(\w+)
- 用户名:
@(\w+)
这是我的检测方法:
- (NSMutableAttributedString*)decorateTags:(NSString *)stringWithTags{
NSError *error = nil;
// Hashtag detection
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\w+) | @(\w+)" options:0 error:&error];
NSArray *matches = [regex matchesInString:stringWithTags options:0 range:NSMakeRange(0, stringWithTags.length)];
NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:stringWithTags];
NSInteger stringLength = [stringWithTags length];
for (NSTextCheckingResult *match in matches) {
NSRange wordRange = [match rangeAtIndex:0];
NSString* word = [stringWithTags substringWithRange:wordRange];
// Set Foreground Color
UIColor *foregroundColor = [UIColor blueColor];
[attString addAttribute:NSForegroundColorAttributeName value:foregroundColor range:wordRange];
NSLog(@"Found tag %@", word);
}
return attString;
}
上面的代码工作得很好,但就像我说的那样,它目前只设置为一次检测一个。所以我修改了正则表达式模式以搜索主题标签和用户名提及,我尝试使用几个运算符,如 |, +, *, *+, ++, +,
等,其中 none 允许检测主题标签和用户名,只是为了清楚这就是我的意思:
"Hey @John check out this #hashtag"
看看两者是如何突出显示的?这就是我所需要的,但在使用苹果正则表达式文档中提供的运算符进行测试后,我只能得到一个突出显示或根本 none。
例如上面的示例代码,#hashtag 将突出显示但@John 不会。
以下是我尝试使用运算符的一些简单示例:
[NSRegularExpression regularExpressionWithPattern:@"#(\w+) + @(\w+)" options:0 error:&error];
[NSRegularExpression regularExpressionWithPattern:@"#(\w+) | @(\w+)" options:0 error:&error];
[NSRegularExpression regularExpressionWithPattern:@"#(\w+) * @(\w+)" options:0 error:&error];
您使用的正则表达式只匹配第一个。如果您在开始迭代之前设置断点,您将看到匹配项计数为 1。
第二个不匹配的原因是 |
周围的空格被计算在内。
使用像 (#|@)(\w+)
这样的正则表达式适用于这种情况。我设置了一个示例项目来测试这个正则表达式并且它有效。
我刚刚意识到我的带有 | (OR)
运算符的代码很好。问题是运算符的每一侧都有一个额外的 space。
这是有效的正则表达式:
[NSRegularExpression regularExpressionWithPattern:@"#(\w+)|@(\w+)" options:0 error:&error];
我有一个在 UITextView
更新期间调用的方法,可以帮助我检测主题标签和用户名提及,例如。 #hashtag
和 @username
如果我一次只尝试检测一个,此代码将完美运行。我只能检测主题标签,或者只能检测用户名提及。
我正在努力让它同时检测到两者。
这是我的两个正则表达式模式:
- 标签:
#(\w+)
- 用户名:
@(\w+)
这是我的检测方法:
- (NSMutableAttributedString*)decorateTags:(NSString *)stringWithTags{
NSError *error = nil;
// Hashtag detection
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\w+) | @(\w+)" options:0 error:&error];
NSArray *matches = [regex matchesInString:stringWithTags options:0 range:NSMakeRange(0, stringWithTags.length)];
NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:stringWithTags];
NSInteger stringLength = [stringWithTags length];
for (NSTextCheckingResult *match in matches) {
NSRange wordRange = [match rangeAtIndex:0];
NSString* word = [stringWithTags substringWithRange:wordRange];
// Set Foreground Color
UIColor *foregroundColor = [UIColor blueColor];
[attString addAttribute:NSForegroundColorAttributeName value:foregroundColor range:wordRange];
NSLog(@"Found tag %@", word);
}
return attString;
}
上面的代码工作得很好,但就像我说的那样,它目前只设置为一次检测一个。所以我修改了正则表达式模式以搜索主题标签和用户名提及,我尝试使用几个运算符,如 |, +, *, *+, ++, +,
等,其中 none 允许检测主题标签和用户名,只是为了清楚这就是我的意思:
"Hey @John check out this #hashtag"
看看两者是如何突出显示的?这就是我所需要的,但在使用苹果正则表达式文档中提供的运算符进行测试后,我只能得到一个突出显示或根本 none。
例如上面的示例代码,#hashtag 将突出显示但@John 不会。
以下是我尝试使用运算符的一些简单示例:
[NSRegularExpression regularExpressionWithPattern:@"#(\w+) + @(\w+)" options:0 error:&error];
[NSRegularExpression regularExpressionWithPattern:@"#(\w+) | @(\w+)" options:0 error:&error];
[NSRegularExpression regularExpressionWithPattern:@"#(\w+) * @(\w+)" options:0 error:&error];
您使用的正则表达式只匹配第一个。如果您在开始迭代之前设置断点,您将看到匹配项计数为 1。
第二个不匹配的原因是 |
周围的空格被计算在内。
使用像 (#|@)(\w+)
这样的正则表达式适用于这种情况。我设置了一个示例项目来测试这个正则表达式并且它有效。
我刚刚意识到我的带有 | (OR)
运算符的代码很好。问题是运算符的每一侧都有一个额外的 space。
这是有效的正则表达式:
[NSRegularExpression regularExpressionWithPattern:@"#(\w+)|@(\w+)" options:0 error:&error];