【问题标题】:How does pattern matching in Expect (TCL) work (without -re flag)?Expect (TCL) 中的模式匹配如何工作(没有 -re 标志)?
【发布时间】:2012-06-11 21:19:51
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: tcl expect


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 在全局模式中,* 与 RE 中的 .* 完全相同,? 与 RE 中的 . 完全相同。字符集是相似的(尽管 RE 有它们的扩展版本)并且反斜杠在 glob 中比 RE 简单得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多