TCL字符串匹配vs regexps

Nar*_*rek 5 regex string tcl string-matching

我们是否应该避免使用regexp,因为它很慢.相反,我们应该使用字符串操作 是否存在两种情况都可以使用但regexp更好的情况?

ste*_*ema 4

您应该使用适合该工作的工具。这意味着,您不应该避免使用正则表达式,而应该在必要时使用它。

如果您只是搜索固定的字符序列,请使用字符串操作。

如果您正在搜索模式,请使用正则表达式。

例子

搜索单词“Foo”。使用字符串操作它也会找到“Foobar”,这样可以吗?不,那么也许搜索“Foo”,但它不会找到“Foo”和“Foo”。

使用正则表达式没有问题,您可以匹配单词边界 /\mFoo\M/ 并且这个正则表达式不会很慢。

我认为这种负面形象来自于灾难性回溯等特殊问题。

最近有一个例子(catastropic-backtracking-shouldnt-be-happening-on-this-regex),这种行为是意外的。

结论

正则表达式必须经过精心设计,否则性能可能会是灾难性的。但如果您使用了错误的算法,同样的情况也可能发生在您的正常代码上。

对于小型工作,使用正则表达式几乎永远不会成为问题,如果您的任务较大并且必须经常重复,请进行基准测试。

根据我自己的经验,我正在分析非常大的文本文件(大约数百 MB)并使用正则表达式来查找我感兴趣的行,并且我不会因为正则表达式而遇到性能问题。

这是关于代码优化的有趣读物