Nar*_*rek 5 regex string tcl string-matching
我们是否应该避免使用regexp,因为它很慢.相反,我们应该使用字符串操作 是否存在两种情况都可以使用但regexp更好的情况?
您应该使用适合该工作的工具。这意味着,您不应该避免使用正则表达式,而应该在必要时使用它。
如果您只是搜索固定的字符序列,请使用字符串操作。
如果您正在搜索模式,请使用正则表达式。
例子
搜索单词“Foo”。使用字符串操作它也会找到“Foobar”,这样可以吗?不,那么也许搜索“Foo”,但它不会找到“Foo”和“Foo”。
使用正则表达式没有问题,您可以匹配单词边界 /\mFoo\M/ 并且这个正则表达式不会很慢。
我认为这种负面形象来自于灾难性回溯等特殊问题。
最近有一个例子(catastropic-backtracking-shouldnt-be-happening-on-this-regex),这种行为是意外的。
结论
正则表达式必须经过精心设计,否则性能可能会是灾难性的。但如果您使用了错误的算法,同样的情况也可能发生在您的正常代码上。
对于小型工作,使用正则表达式几乎永远不会成为问题,如果您的任务较大并且必须经常重复,请进行基准测试。
根据我自己的经验,我正在分析非常大的文本文件(大约数百 MB)并使用正则表达式来查找我感兴趣的行,并且我不会因为正则表达式而遇到性能问题。