如何使用if语句检查文本的某个字符串是否在另一组字符中?

时间:2019-03-26 19:31:17

标签: tcl

我想创建一个if语句,当某些字符在另一组文本中时将返回一个值。例如,如果我有水和火这两个字。我要创建一个if语句,该语句将检查我输入的单词是否包含字符“ wa”,然后它将返回值1。与此类似。

set word "water"
set tempvar 0
if {$word has characters "wa"} {
    set tempvar 1
}

3 个答案:

答案 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选项的-lengthstring 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