我想创建一个if语句,当某些字符在另一组文本中时将返回一个值。例如,如果我有水和火这两个字。我要创建一个if语句,该语句将检查我输入的单词是否包含字符“ wa”,然后它将返回值1。与此类似。
set word "water"
set tempvar 0
if {$word has characters "wa"} {
set tempvar 1
}
答案 0 :(得分:2)
搜索子字符串是否存在的最简单(也是最快的方式)是string first
命令;如果不存在子字符串,则返回-1;如果存在子字符串,则返回该位置的(第一个)索引。
if {[string first "wa" $word] >= 0} {
set tempvar 1
}
另一种行之有效的技术是Tcl正则表达式引擎的鲜为人知的操作模式之一:如果RE以***=
开头,则字符串的其余部分为文字。
# This is marginally slower than string first; the overhead of the RE engine matters a little
if {[regexp ***=wa $word]} {
set tempvar 1
}
请注意,如果您要询问它是否是前缀,则其他命令更合适(带有string equal
选项的-length
或string match
)。如果您想知道某个特定值是否是列表中的元素,请使用lsearch
而不是字符串搜索。
答案 1 :(得分:1)
我会将其封装在proc中:
proc string_contains {haystack needle} {
expr {[string first $needle $haystack] != -1}
}
然后
% string_contains water wa
1
% string_contains fire wa
0
和
% if {[string_contains water wa]} then {puts yes} else {puts no}
yes
% if {[string_contains fire wa]} then {puts yes} else {puts no}
no
答案 2 :(得分:0)
通常,出于匹配目的,在任何语言中,都使用正则表达式,此处用作 regexp $ pattern $ string ,如果有匹配项,则返回1。 / p>
set word "water"
set tempvar 0
if {[regexp "wa" $word]} {
set tempvar 1
}
puts $tempvar