匹配tcl中的正则表达式{*}

时间:2013-07-11 18:57:21

标签: regex tcl

我正在尝试使用TCL脚本中的{*}正则表达式将名称与自身以及可能的后缀进行匹配。例如:

#!/usr/bin/tclsh
set name "g_renamed_d"
set pattern "g_renamed*"
if {  [string match "$name" "$pattern"]} {
    puts " matched!" 
} else {
    puts " not matched!!!!!"
}

如果不起作用,我尝试从模式变量中移除星号并使用[string match "$name" "$pattern"*][string match $name $pattern*][string match $name {$pattern*}],但都无济于事。我看过其他一些与我所做的相似的例子;我错过了什么?

3 个答案:

答案 0 :(得分:3)

您可以尝试使用以下语法:

#!/usr/bin/tclsh
set name "g_renamed_d"
set pattern "^g_renamed.*"
if {[regexp $pattern $name match]} {
    puts " matched! :)" 
    puts $match
} else {
    puts " not matched! :("
}

请注意,上面的模式允许包括除换行符之外的空格的各种字符。如果你想要一个更“合理”的模式,你可以用一个带有后缀允许的字符的字符类替换逗号:

set pattern "^g_renamed[a-z0-9_]*" # all "word" character (the same as \w)

set pattern "^g_renamed\S*"    # all that is not a white space

但是,如果您只想检查字符串是否以您的目标开头,那么这种模式就足够了:

set pattern "^g_renamed"

答案 1 :(得分:3)

你正在将glob风格的明星与正则表达式(Kleene)明星混在一起。

在正则表达式中,*并不意味着“任何字符的字符串”,就像glob式的用法一样。 *+?都称为量词,分别表示“0或更多”,“1或更多”,以及“0或1” “重复 前面的原子(字符)

因此,例如,*本身不执行任何操作,但a*匹配0或更多a s。

要匹配0个或更多任何,您需要在通配符上放置一个量词,正则表达式中的量词是.,意思是“任何字符除外换行符。“这就是为什么,正如@CasimiretHippolyte在他的回答中首先提到的那样,你需要g_renamed.*

此外,regexp匹配的方式是,如果模式匹配字符串中的 where ,则返回true。也就是说,名称foog_renamedbar也会通过!这就是@CasimiretHippolyte建议使用^,它匹配字符串的开头,模式锚定< / em>到字符串的开头。 (同样,$是另一个锚点,这个锚点匹配字符串的 end 。)


顺便说一句,如果您真的想要glob - 样式匹配,请使用string match

答案 2 :(得分:0)

你做反向比较。只需更改它将起作用的内容。喜欢 触发; TCL;

eval {
    set pattern "g_renamed_d"
    set name "g_renamed*"
    if { [string match -nocase "$name" "$pattern"] } {  
        puts " matched!" 
    } else {
        puts " not matched!!!!!"
    }       
}