0

假设我得到了这个字符串:100:~#100:~/tmp

这实际上意味着,我需要匹配机器的终端提示符(可能包含也可能不包含路径)。通常,使用此正则表达式模式:

100:(~|/)(/+[a-zA-Z0-9]*)*#

它适用于输入字符串,例如:100:~/foo/bar/foo/baz#

你可以在这里测试它:Regex Pal

但是在 TCL 中使用 Expect,我必须添加-re以匹配这样的模式。但是,我不允许这样做。我在没有正则表达式的情况下尝试了上述模式,但失败了。

当前匹配100:~#or100:~/tmp的模式非常简单:100:[~/]*#,我被告知这是匹配字符串的 shell 表达式,而不是正则表达式。该100:[~/]*#模式意味着它匹配100:[~/](~/是可选的) 和之间的任何内容#。该*字符旨在匹配任何内容,而不是*在传统正则表达式意义上为零或更多的正则。

-re没有标志的 Expect 中的模式匹配表达式到底是什么?

4

1 回答 1

4

它们被称为“glob”模式。它们是根据 shell 的模式匹配来设计的。文档在这里:http ://tcl.tk/man/tcl8.5/TclCmd/string.htm#M40

* 匹配字符串中的任何字符序列,包括空字符串。

? 匹配字符串中的任何单个字符。

[ chars ] 匹配由chars给出的集合中的任何字符。如果xy形式的序列出现在字符中,则xy之间的任何字符(包括在内)都将匹配。与 一起使用时-nocase,范围的端点首先转换为小写。而{[A-z]}在区分大小写匹配时匹配“<code>_”(因为“<code>_”介于“<code>Z”和“<code>a”之间),-nocase这被认为是{ [A-Za-z]}(可能是什么最初的意思)。

\ x 匹配单个字符x。这提供了一种避免对pattern*?[]\中的字符进行特殊解释的方法。

于 2012-06-11T12:48:45.680 回答