TCL/EXPECT中正则表达式的含义

3

我阅读了一个 TCL 测试脚本,它使用 EXPECT。其中一些代码如下:

expect ".*hello.*yes.*morning.*"

通配符“*”可以匹配任何内容,但是在它前面加上“.”又代表什么意思呢?想要匹配哪种模式呢?
3个回答

6
请注意,expect命令的默认匹配风格是-glob,因此那些点实际上是字面上的点。有关Glob样式匹配的帮助可以在string match文档中找到。
如果您希望将模式视为正则表达式,您需要这样说:
expect -re ".*hello.*yes.*morning.*"

如果期望的命令匹配样式是-glob,那么这是否意味着我需要在“expect”后面添加关键字“match”,就像这样:expect match ".*hello.*yes.morning."? - user707549
根据《探索Expect》一书,"*"是通配符,可以匹配任何内容,但是在它前面的"."是什么意思呢?它只是一个字面上的点吗?这是否意味着输入应该以"."开头,例如输入为".aaaahello.bbbyes.cccmorning.",那么就会匹配成功?而在其他情况下则不匹配? - user707549
@ratzip,“match”只是“string”命令的子命令。“expect”命令不使用它。如我在答案中所写,对于glob匹配,点是字面上的点。 - glenn jackman

3

在正则表达式中,* 不是通配符,而是 . 才是。. 后面的 * 表示前一个字符/字符类出现 0 次或多次。因此,在这里它表示:任意符号的 0 或多个重复。还需要注意的是,根据正则表达式选项,. 通常不包括换行符。


我可以问一个愚蠢的问题吗?在TCL/EXPECT中使用的正则表达式和其他编程语言中使用的一样吗? - user707549
嗯,在我使用TCL的这一年中,我没有注意到任何显着不同的行为,但我不能保证。许多时候,正则表达式在不同的语言中会有所不同,尽管在你很可能不经常使用的功能上。 - KillianDS
@ratzip -- 在不同的编程语言中,正则表达式语法存在许多细微的变化,同时还有两种不同的风格(Perl-ish v. Grep-ish),它们之间的区别主要在于哪些字符需要在前面加上反斜杠\。这里是一个关于Tcl的特定信息的Tcl Wiki页面:http://wiki.tcl.tk/396 - Herbert Sitz
Tcl的正则表达式与Perl的正则表达式相似但并非完全相同。文档可在http://www.tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm找到。 - glenn jackman
@glenn:Tcl正则表达式和Perl正则表达式之间的重大区别在于,Perl使用堆栈机实现,而Tcl编译为可以在贪婪模式和非贪婪模式之间切换的自动机。这是一种基本差异,具有大量微妙的后果(既有好处也有坏处)。 - Donal Fellows
@KillianDS: 听起来你可能混淆了_glob_模式和_正则表达式_。它们看起来很相似,但实际上并不是。Glob模式主要用于匹配文件名。Tcl正则表达式与其他正则表达式类似(但不完全相同),但所有正则表达式都与glob模式不同。 - Bryan Oakley

1

*在正则表达式中不是通配符。你可能想到的是带有文件名通配符的shell操作,但这并不是*在正则表达式中的工作方式。它们是完全不同的东西。在你的正则表达式中,.匹配任何字符,然后*表示“匹配前面的字符0次或多次”。

以下是一些关于正则表达式的信息: http://www.regular-expressions.info/tutorial.html

这里还有一个页面直接解决了正则表达式新手可能会遇到的正则表达式和shell文件名匹配模式之间的混淆:

http://docstore.mik.ua/orelly/unix3/upt/ch32_02.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接