我正在尝试使用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*}]
,但都无济于事。我看过其他一些与我所做的相似的例子;我错过了什么?
答案 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!!!!!"
}
}