Tcl-匹配全局模式中的结束括号

Tcl-匹配全局模式中的结束括号,tcl,glob,Tcl,Glob,如何获得switch语句来计算结束括号?我尝试了“[]]”和“[[\]]” 您可以使用: set x "]"; switch -glob $x { \] { puts "MATCH ]" } } 或要匹配多个括号,请执行以下操作: set x "foo]bar"; switch -glob $x { *\]* { puts "MATCH ]" } } 当您想将]作为开关中一组字符的一部分进行匹配时,您只有几个选项: 使用-reg

如何获得
switch
语句来计算结束括号?我尝试了
“[]]”
“[[\]]”

您可以使用:

set x "]";
switch -glob $x {
    \] {
        puts "MATCH ]"
    }
}
或要匹配多个括号,请执行以下操作:

set x "foo]bar";
switch -glob $x {
    *\]* {
        puts "MATCH ]"
    }
}

当您想将
]
作为
开关
中一组字符的一部分进行匹配时,您只有几个选项:

  • 使用
    -regexp
    匹配,而不是
    -glob
    。它更复杂,需要不同的模式,但它肯定更灵活(特别是在这样的事情上)

  • 在正文共享中使用多个子句:

    switch -glob $x {
        {\[} - {\]} - [(){}] {
            puts "Matched!"
        }
    }
    

  • 您不能做的是将
    ]
    放在全局匹配集中,除非作为范围的非初始部分(全局匹配器非常愚蠢,但速度很快)。没有任何合适的范围可以完全匹配您在这里所要查找的内容,因此单个glob将不起作用。

    此外,一个literal
    ]
    也可以起作用(这在解析为列表的内容中),而
    {]}
    也是如此。Globbing只将
    ]
    视为特殊的,当它跟在一个(未scaped的)
    [
    之后时。我需要它作为几个选项之一。我的完整程序有如下内容
    “[()[]{}”
    ,当然这不起作用。但是你的例子将只匹配括号,其他什么都不匹配。@DonalFollows,这从问题中可以明显看出。在问题中,我试图匹配开始括号和结束括号。这都是基于你对Noxx的另一个很好的答案的评论,你在匹配这个答案(如果它起作用的话):
    [()[]{}]
    switch -regexp $x {
        ^[][(){}]$ {
            puts "Matched!"
        }
    }
    
    switch -glob $x {
        {\[} - {\]} - [(){}] {
            puts "Matched!"
        }
    }