正则表达式适用于主题标签和@usernames,但不适用于URL的

时间:2015-08-25 18:38:57

标签: ios objective-c regex

我有一个正则表达式,我用了一段时间来突出显示主题标签(例如。#stackoverflow)或用户名/提及(例如。@jeffjohnson),同时用户输入文字

以下是我创建该正则表达式的方法:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(#|@)(\\w+)|(#|@)" options:0 error:&error];

我想添加这个正则表达式模式,以便它也会突出显示一个URL。所以我将其更改为以下模式:@"(#|@|http)(\\w+)|(#|@|http)"

当它们键入http时,它会正常显示,但是当它们键入冒号(:)时,冒号不会突出显示。

如果我尝试将www添加到正则表达式模式中,就像我添加http一样,同样的事情就会发生。 www会正确突出显示,但只要您键入句点(.),该句点就不会突出显示。

如何为此正则表达式模式添加完整的URL检测?

3 个答案:

答案 0 :(得分:1)

这是因为你的正则表达式正在寻找(英文):一个哈希符号或一个At符号或者http后面紧跟着字符类\ w(它的结果是[a-zA-Z0-9_],这是一个字符允许任何字母,无论大小写,任何数字,以及下划线的类。)并且其中存在您的问题,如果您想突出显示URL以及哈希标记和用户名/提及,我会推荐这样的正则表达式:< / p>

((?:#|@)\w+|http\S+)

如果你愿意,你可以在正则表达式中获得尽可能复杂的效果,但这对大多数情况都适用。

在英语中,这个正则表达式正在寻找:哈希符号或符号后跟字符类\ w,或者http后跟一个或多个非空格字符。

答案 1 :(得分:1)

对于网址,您不应该尝试使用自己的正则表达式。 URL的格式非常宽松。 W3C确实在RFC中提供了标准的参考正则表达式(我忘记了哪一个)

在这种情况下你应该使用的是内置的NSDataDetector类,它已经完成了你找到它所谓的链接的工作。

答案 2 :(得分:0)

使用这个正则表达式,我还没有测试过,但我确信它几乎是正确的你可能需要在其中修改一下,否则我觉得它应该可行

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(#|@|((http|https)[:][/][/](w{3}[.])?([a-z]+[.])+([a-z]+[/]*)))" options:0 error:&error];

它也会接受此网址

的网址
http://stackoverflow.com/questions/32211615/regex-works-perfectly-for-hashtags-and-usernames-but-not-for-urls/32212039#32212039

当然是简单的

http://google.com