Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCL字符串匹配vs regexp_Regex_String_Tcl_String Matching - Fatal编程技术网

TCL字符串匹配vs regexp

TCL字符串匹配vs regexp,regex,string,tcl,string-matching,Regex,String,Tcl,String Matching,我们应该避免使用regexp,因为它很慢,这对吗。相反,我们应该使用字符串操作。是否有两种情况都可以使用,但regexp更好?我不知道Tcl的具体情况,但通常可以说,如果您要查找精确的文本匹配(例如,查找所有以\define开头的行),那么字符串操作会更快。但是,如果您正在寻找模式(例如,所有包含以c开头并以t结尾的单词的行),那么正则表达式就是合适的工具(\bc\w*t\b将是一个很好的正则表达式-将其与您自己编写的程序逻辑进行比较 即使在这样的情况下regex速度较慢,它在执行速度方面也很有

我们应该避免使用regexp,因为它很慢,这对吗。相反,我们应该使用字符串操作。是否有两种情况都可以使用,但regexp更好?

我不知道Tcl的具体情况,但通常可以说,如果您要查找精确的文本匹配(例如,查找所有以
\define
开头的行),那么字符串操作会更快。但是,如果您正在寻找模式(例如,所有包含以
c
开头并以
t
结尾的单词的行),那么正则表达式就是合适的工具(
\bc\w*t\b
将是一个很好的正则表达式-将其与您自己编写的程序逻辑进行比较

即使在这样的情况下regex速度较慢,它在执行速度方面也很有可能无关紧要,但当需要更改匹配逻辑时,它将非常重要(哦,现在我们需要寻找一个以
c
开头,以
t
结尾,但至少包含两个
a
s和no
x
-->-
\bc(?=\w*a\w*a)(?!\w*x)\w*t\b


大多数正则表达式引擎不想去的地方是递归(匹配嵌套标记、嵌套括号等)。这就是解析器进入画面的地方。

regexp
aka正则表达式用于匹配许多不同的字符串,可能非常复杂,甚至可以验证特定的输入。
字符串匹配
只允许使用通配符,如
*
以及与regexp中的
[]
相同的基本字符分组。
您可以在这里阅读:
这里解释了regexp在一些示例中可以做什么的基本指南:


因此,简而言之:如果您不需要regexp,甚至对它不太了解,我建议您不要使用它。如果您只是想比较两个字符串是否相等,请使用
string equal
,您应该为该作业使用适当的工具。这意味着,您不应该避免使用regex,应该在必要时使用它

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

如果要搜索模式,请使用正则表达式

示例

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

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

我认为这种负面形象来自一些特殊的问题,比如

最近有一个例子()表明这种行为是意外的

结论

正则表达式必须设计得很好,如果设计得不好,那么性能可能是灾难性的。但是,如果使用的算法不好,普通代码也可能发生同样的情况

对于一个小任务来说,使用正则表达式几乎从来都不是问题,如果您的任务更大并且必须经常重复,那么就做一个基准测试

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

正则表达式(REs)是一把神奇的锤子。它们可以优雅地解决一些问题,还可以用蛮力解决更多问题,但它并不漂亮。如果你对某些问题进行了足够的处理,可以用REs解决,但有更好的解决方案可用(例如,非常适合
字符串映射的东西

string match
-或globbing-可以看作是正则表达式的简化版本。glob模式通常比等价的正则表达式短(字符类是一个例外,支持它们,glob需要拼出来)。我不知道性能有什么不同;我希望
字符串匹配
在等效模式上会稍微快一点,因为逻辑更简单,但是
时间
比预期可靠得多

对于更容易使用REs的特定情况,从上下文中提取子字符串与通过简单字符位置提取子字符串是一个很好的例子。或者,对于匹配多个备选方案中的一个来说


我的经验法则是使用最简单的方法。如果这是字符串匹配,那就太好了。如果模式太复杂了,那么请转到regexp,并为您的选择感到高兴。

我能给出的最好建议和我自己使用的建议是,只有在更简单的解决方案不起作用时才使用正则表达式。

如果您可以使用简单的字符串匹配,或者使用全局模式,请使用它们。只有当这些模式无法工作时,您才应该使用正则表达式


为了回答您的具体问题,我想说,没有时间可以使用任何一种方法,但是正则表达式是更好的选择。也许有一种情况我没有想到,但一般来说,更简单的解决方案总是更好。

正则表达式匹配是一种字符串操作。虽然它没有那么快作为一些更基本的操作,它的功能也更强大。它也更难使用,特别是如果您还不知道REs的基本语法,但这不是避免它们的原因。但是,用基本字符串操作集合替换正则表达式只会导致程序变得更长:有时,您只需要复杂的操作

Tcl做了许多事情来提高重操作的效率。值得注意的是,它检测特别简单的重操作,并将其转换为类似全局的匹配(如
字符串匹配
)它可以做很多事情来缓存已编译的REs格式,从而减少匹配的开销。它还使用了一个自动机理论匹配引擎,在匹配过程中有更少的惊喜