TCL string match vs regexps
是正确的,我们应该避免使用正则表达式,因为它很慢。 相反,我们应该使用字符串操作。 是否有可以同时使用但regexp更好的情况?
您应该使用适当的工具进行作业。这意味着,您不应避免使用正则表达式,而应在必要时使用它。
如果您只是在搜索固定的字符序列,请使用字符串操作。
如果要搜索模式,请使用正则表达式。
Example
Search for the word"Foo". use string operations it will also find
"Foobar", is this OK? NO, well then maybe search for"Foo", but then
it will not find"Foo," and"Foo."With regex no problem, you can match for a word boundary /\\mFoo\\M/ and
this regex will not be slow.
我认为这种负面形象来自灾难性的回溯之类的特殊问题。
最近有一个例子(此正则表达式发生灾难性的回溯,应该发生),这种行为是意外的。
结论
正则表达式必须经过精心设计,如果不是,那么性能可能是灾难性的。但是,如果使用错误的算法,您的常规代码也可能发生同样的情况。
对于小的工作,使用正则表达式几乎不会成为问题,如果您的任务较大并且必须经常重复,则进行基准测试。
根据我自己的经验,我正在分析非常大的文本文件(大约100 MB),并使用正则表达式来查找我感兴趣的行,而由于正则表达式,我不会遇到性能问题。
这里是有关代码优化的有趣读物
正则表达式(RE)真是棒极了。他们可以优雅地解决一些问题,并且可以通过蛮力解决更多问题,但这并不是很漂亮。如果您击中RE,可以解决一些问题,但是有很多更好的解决方案(例如,很适合
对于RE更易于使用的特定情况,从上下文中提取子字符串而不是通过简单字符位置来提取子字符串是一个很好的例子。或用于匹配多个备选方案之一。
我的经验法则是使用最简单的方法。如果那是
我可以提供的最佳建议以及我自己使用的建议是,仅在更简单的解决方案不起作用时才使用正则表达式。
如果可以使用简单的字符串匹配或使用全局模式,请使用它们。只有当那些不能工作时,您才应该使用正则表达式。
为了解决您的特定问题,我会说,不,没有时间可以使用两者之一了,但是正则表达式是更好的选择。也许我没有想到一个极端的情况,但是总的来说,简单的解决方案总是更好。
正则表达式匹配是一种字符串操作。尽管它的速度不如某些基本操作快,但它的功能也要强大得多。它也更难使用,尤其是在您不了解RE的基本语法的情况下,但这不是避免使用RE的理由。但是,用一组基本的字符串操作替换正则表达式只会导致程序变得更长:有时,您只需要复杂的操作即可。
Tcl做了很多事情来使RE操作更高效。值得注意的是,它检测到特别简单的RE,并将它们转换为类似glob的匹配项(如
简而言之,不要回避它们。在适当的地方使用它们。 (如果您对速度有疑问,请输入
我并不特别了解Tcl,但是通常可以说,如果您要查找完全匹配的文本(例如,找到所有以
即使正则表达式在这种情况下运行速度较慢,也很有可能在执行速度方面无关紧要,但是,当需要更改匹配逻辑时,它会变得很重要(哦,现在我们需要看一下对于以
大多数正则表达式引擎都不希望出现的地方是递归(匹配嵌套标记,嵌套括号等)。那就是解析器输入图片的地方。
您可以在这里阅读有关内容:http://www.tcl.tk/man/tcl8.5/TclCmd/string.htm#M40
此处介绍了regexp还可以通过一些示例执行的基本指南:http://www.regular-expressions.info/
简而言之:如果您不需要正则表达式,或者甚至不了解它,我建议您不要使用它。如果只想比较两个字符串的相等性,请使用