我们应该避免使用正则表达式因为它速度较慢,而应该使用字符串操作。但是,是否存在某些情况下同时使用正则表达式和字符串操作更好呢?
我们应该避免使用正则表达式因为它速度较慢,而应该使用字符串操作。但是,是否存在某些情况下同时使用正则表达式和字符串操作更好呢?
结论
正则表达式必须设计得很好,否则性能可能会灾难性的下降。但是如果使用不良算法,则您的普通代码也可能发生相同的情况。
对于小型任务,使用正则表达式几乎永远不会成为问题,如果您的任务更大且需要经常重复,请进行基准测试。
从我的经验来看,我正在分析非常大的文本文件(几百 MB),并使用正则表达式查找我感兴趣的行,由于正则表达式,我没有遇到性能问题。
我不太了解Tcl,但一般来说,如果你要查找精确的文本匹配(例如查找所有以#define
开头的行),那么字符串操作会更快。但是,如果你要查找模式(例如包含以c
开头且以t
结尾的单词的所有行),那么正则表达式就是正确的工具(\bc\w*t\b
是一个很好的正则表达式 - 如果你自己编写程序逻辑进行比较,你会发现这个正则表达式非常方便)。
即使在这种情况下正则表达式速度较慢,执行速度的影响可能不大,但当需要更改匹配逻辑时,它将非常重要(哦,现在我们需要查找以c
开头且以t
结尾的单词,但包含至少两个a
和没有x
-> \bc(?=\w*a\w*a)(?!\w*x)\w*t\b
)。
大多数正则表达式引擎不愿涉及的地方是递归(匹配嵌套标记、嵌套括号等)。这就是解析器进入图片的地方。
正则表达式匹配是一种字符串操作。虽然它不像一些更基本的操作那样快,但它的能力更强大。它也更难使用,特别是如果您不知道RE的基本语法,但这并不是避免使用它们的理由。然而,用一组基本的字符串操作替换正则表达式可能会导致程序变得非常冗长:有时候,您需要复杂的操作。
Tcl做了很多事情来使RE操作更有效率。特别地,它检测到特别简单的RE并将它们转换为类似于glob的匹配(如string match
),这样速度更快但功能更少,并且它还做了很多事情来缓存RE的编译形式,以便匹配具有更少的开销。它还使用了一个自动机理论匹配引擎,在匹配时间内没有太多意外(代价是在首次编译RE时需要更多时间)。
总之,不要避免使用它们。在适当的地方使用它们。(如果您对速度有疑问,请使用time
命令。)
regexp
,也称正则表达式,用于匹配许多不同的字符串,可以非常复杂,甚至可以验证特定的输入。
string match
只允许使用通配符,如 *
和 ?
,以及基本字符分组,就像在 regexp 中一样。
您可以在此处阅读有关它的更多信息:http://www.tcl.tk/man/tcl8.5/TclCmd/string.htm#M40
这里有一个基本指南,其中包含一些示例,说明了 regexp 的功能:http://www.regular-expressions.info/
简而言之:如果您不需要 regexp,甚至对其了解不多,我建议您不要使用它。如果您只想比较两个字符串是否相等,请使用 string equal
。