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



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

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

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

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

当他们键入时,这可以正常工作http它会突出显示,但是当他们键入冒号(:(时,冒号不会突出显示。

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

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

这是因为您的正则表达式正在寻找(英语(:哈希或 At 符号或 http 紧跟字符类 \w(计算结果为 [a-zA-Z0-9_],这是一个字符类,允许任何字母,无论大小写、任何数字以及下划线。 这就是你的问题所在,如果你想突出显示一个 URL 以及哈希标签和用户名/提及,我会推荐一个正则表达式,比如这:

((?:#|@)w+|httpS+)

如果需要,您可以在正则表达式中尽可能复杂,但这在大多数情况下都可以正常工作。

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

对于 URL,您不应该尝试滚动自己的正则表达式。URL的格式非常松散。W3C 确实在 RFC 中提供了一个标准的参考正则表达式(我忘了是哪一个(

在这种情况下,您应该使用内置的NSDataDetector类,该类已经为您完成了查找其调用链接的工作。

使用这个正则表达式,我还没有测试过它,但我相信它几乎是正确的,您可能需要在其中进行一些修改,否则我认为它应该可以工作

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

最新更新