Iphone 试图找到一种比正则表达式更快的方法来查找URL';在一个字符串中。。。有什么想法吗?
我有一个Iphone 试图找到一种比正则表达式更快的方法来查找URL';在一个字符串中。。。有什么想法吗?,iphone,objective-c,ios,xcode,cocoa-touch,Iphone,Objective C,Ios,Xcode,Cocoa Touch,我有一个NSString,它来自一个HTML页面,长度为37014个字符,其中大约有20个URL。我使用此代码查找URL并将其放置在NSArray: NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\\.(?:jpg|gif|png))(?:\\?([^#]*))?(?:#(.*))?"
NSString
,它来自一个HTML页面,长度为37014个字符,其中大约有20个URL。我使用此代码查找URL并将其放置在NSArray
:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\\.(?:jpg|gif|png))(?:\\?([^#]*))?(?:#(.*))?"
options:NSRegularExpressionCaseInsensitive
error:&error];
NSArray *matches = [regex matchesInString:final
options:0
range:NSMakeRange(0, [final length])];
问题是,即使在iPhone4S上,代码也需要5秒钟才能执行。这对一页来说太慢了。。。我需要浏览20个HTML页面
有没有更快的办法?可能是
NSScanner
或NSRange
?有人有什么创意吗?用NSTextCheckingTypeLink
看看你的正则表达式有点极端。它不会很快就失败,因为你可能会确定这些东西是不匹配的。从粗略的角度来看,看起来您正在对整个字符串进行几乎N^2的搜索。你应该尽可能早地消除匹配
你真的希望你的URL以非单词边界开始吗
你的正则表达式太笼统了。分析您的数据,看看您是否真的希望解析如此自由的URL。最后,您最好使用几个早期失败的正则表达式,而不是一个复杂到几乎匹配所有内容的正则表达式
另外,请确保在下载数据的后台线程中执行此操作。与下载相比,您的搜索应该不会花费太长时间-尽管搜索37k字节需要5秒。。。我的眼睛几乎可以做到这一点。自动超链接(https://bitbucket.org/sholt/autohyperlinks2/overview)这是一个非常好的库。只是一个问题-您是否100%确定上面的代码需要5秒才能运行?大约5秒。。。也许四点。但是,是的,在一台设备上,这需要花费很长时间。在模拟器上它运行得很快,因为它是在计算机上运行的。比我的速度快得多。非常感谢!我使用[[myString pathExtension]isEqualToString:@“jpg”]来检测URL是否以我想要的扩展名结尾。