- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我的应用程序,我需要查看 url 是否与正则表达式字符串匹配。所以我创建了一个包含所有正则表达式字符串(大约 1000 多个字符串)的数组,并使用 RegexKit lite 检查它们:
for (NSString * aString in mainDelegate.whiteListArray) {
if (![urlString isMatchedByRegex:aString]) {
dyld: Library not loaded: @executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit Referenced from: /Users/Reilly/Library/Application Support/iPhone Simulator/User/Applications/7E057EA8-5CD1-465B-8102-38A53A9B5F5B/Drowser.app/Drowser Reason: image not found
最佳答案
注意:我是 RegexKit 等人的作者。
这是一个相当复杂的答案.. :)
首先,将一千个正则表达式与任何常用的正则表达式引擎实现匹配会相当慢,可能除了 TCL 和 TRE 正则表达式引擎。 RegexKit.framework
在这个任务中的性能大大优于 RegexKitLite
的原因是 RegexKit.framework
有相当多的非平凡的优化代码来完成这个任务。这样做的原因是因为它用于 Safari AdBlock,它需要对 URL 执行正则表达式的批量匹配。它根据它们成功匹配的次数保持正则表达式列表按排序顺序排列。这是基于观察到 Safari AdBlock 中使用的一些正则表达式模式比其他模式匹配得更频繁,并且首先尝试这些模式大大减少了需要尝试确定是否存在“命中”的正则表达式的数量。还有一个小的负命中缓存,以及许多并行执行匹配的多线程代码。这些都不会出现在 Lite
版本中,因为它绝对不是一个轻量级的功能——可能有 60-70KB 的代码只是为了实现这个功能,更不用说保持一千个编译的巨大内存占用了正则表达式。
使用 RegexKitLite
做这种模式匹配肯定会非常非常慢。第一个问题是它只保留了最近使用的编译正则表达式的小缓存。默认情况下,缓存设置为仅 23
,因此向其扔一千个正则表达式将导致每次使用每个正则表达式时都会对其进行编译。
正如其他人指出的那样,RegexKit.framework
并没有真正设置为在 iPhone 上使用。即使您绕过“链接到外部框架”规定,RegexKit.framework
的默认构建也不在其胖二进制文件中包含 arm
架构(它包括 ppc
、 ppc64
、 i386
和 x86_64
)。你真正需要做的是设置一个新的构建目标来创建一个静态库。做起来并不难,真的。
恐怕如果这种模式匹配是您需要做的事情,您可能不得不推出自己的正则表达式引擎。您需要的是一个正则表达式引擎,它可以将您的数千个正则表达式连接在一起,例如“r1|r2|r3|r4
”。大多数正则表达式引擎,特别是 pcre
和 ICU
(分别由 RegexKit.framework
和 RegexKitLite
使用的引擎)以几乎从左到右的方式评估这样的正则表达式。需要的是一个几乎类似于 DFA 的引擎,它可以同时评估所有可能的状态。有关详细信息,请参阅 this link。我已经构建了这样一个正则表达式引擎,它甚至可以在 ~ O(M*log2(N))
(M 是要匹配的文本的大小,N 是正则表达式的大小)时间内处理反向引用(比每个人都说的容易得多),但是它还没有完成。如果是这样,它将像等 ionic 炬穿过黄油一样解决这类问题。
不过,我知道至少有一个人将 RegexKit.framework
移植到 iPhone: Mobile Safari AdBlock 。 AFAIK,它也是桌面版 Safari AdBlock 的一个端口。我不知道很多细节,但我认为它需要安装越狱的 iPhone。
总之,我认为没有任何可用于 iPhone 开发的交 key 解决方案可以满足您的需求。除了创建自己的正则表达式引擎之外,最好的选择是查看 TRE regex engine 并尝试使用串联的正则表达式进行一些实验。不过,要做好卷起袖子的准备,因为你将不得不弄脏你的手并处理 Cocoa 的字符串、Unicode 编码和各种其他令人不快的东西——RegexKitLite
需要的那种东西在幕后为您照顾。
关于iPhone:RegexKit 与 RegexKit lite - 遍历数组需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1240789/
对于我的应用程序,我需要查看 url 是否与正则表达式字符串匹配。所以我创建了一个包含所有正则表达式字符串(大约 1000 多个字符串)的数组,并使用 RegexKit lite 检查它们: for
我最近想在 Cocoa 应用程序中使用正则表达式。但我发现 Cocoa 不包含正则表达式类。所以我决定使用RegexKit(OgreKit很好,但我不知道为什么它在我的OSX 10.6.4 x86_6
我采纳了这里一些帖子的建议,这些帖子推荐 regexkit lite,但我在尝试从字符串中提取特定 URL 时遇到了问题。问题是我对使用它的语法非常迷茫,希望使用过它的人可以帮助我。 我试图解析的字符
我对 Mac OS X 开发还很陌生(只是我的第二天)。做了几个月的 iOS 编程,掌握了基础知识,制作了一个小应用程序。然后,当我突然遇到一个问题时,我决定也为 Mac OS X 制作它:NSReg
我是一名优秀的程序员,十分优秀!