你能解决这个正则表达式吗?

时间:2011-08-02 04:47:49

标签: objective-c regex

我对RegEx很糟糕,并且在互联网上找到了这个位置。它用于匹配Twitter风格的@username,但它有一个小问题 - 它也接受一个空格作为单词。

NSRegularExpression *atRegex = [NSRegularExpression regularExpressionWithPattern:@"(?<!\\w)@([\\w\\._-]+)?" options:NSRegularExpressionCaseInsensitive error:&error];

示例:“@erik”匹配正确,但“@ erik”也匹配,不应该匹配。

3 个答案:

答案 0 :(得分:3)

您的正则表达式包含

@(...)?

最后的?表示前面(...)内的所有内容都是完全可选的。因此,你的正则表达式不必匹配@。

之后的任何内容

要解决此问题,您可以删除( )?,离开:

"(?<!\\w)@[\\w\\._-]+"

但是,您还应该调查(?<!\\w)为您做了什么,以及您是否需要它。

答案 1 :(得分:1)

@ erik匹配的原因很可能是因为您的捕获组是:

([\\w\\._-]+)

这意味着一个或多个单词characteres,句点,下划线或短划线。所以@ erik匹配sinced“erik”符合此标准。 lookbehind asertion和@符号不包含在匹配组中,但它们应该是匹配的标准。

尝试组合你所拥有的零宽度负面外观asertion

(?!<\\w)

表示任何非单词字符,进入您的捕获组。它不会包含在匹配中,但将结合起来表示“找到一个或多个单词字符,句号,下划线或短划线的字符串,跟随非单词字符和”@“符号。正如Tim指出的那样,这是为了避免电子邮件匹配。

试试这个:

"((?<!\\w)@[\\w\\._-]+)" 

*请注意我不是一个客观的程序员,所以我不熟悉它,知道你是否需要写\\ w而不是\ w。在我习惯的正则表达式中,你只能使用一个转义字符。如果上述方法无效,请查阅您的文档。

答案 2 :(得分:0)

@ \ S *

http://regexpal.com/可以真正帮助绑定