Tcl中不区分大小写的比较

vas*_*111 2 tcl

我在TCL中有代码:

set a 1
set b 0
set c "Start"
if { $a == 1 && ($b == 1 || $c == "Start") } {
    puts Works
}
Run Code Online (Sandbox Code Playgroud)

我想 $c == "Start"检查不区分大小写Start.我该怎么做?

Jer*_*rry 6

你可以使用string compare:

string compare ?-nocase? ?-length int? string1 string2
Run Code Online (Sandbox Code Playgroud)

对字符串string1和字符串执行逐个字符的比较string2.返回-1,, 01取决于string1词典上是否小于,等于或大于string2.如果-length指定,则在比较中仅使用第一个长度字符.如果-length是否定的,则忽略它.如果-nocase指定,则以不区分大小写的方式比较字符串.

所以,如果它返回0,那么你就$c完全等于String.

set a 1
set b 0
set c "Start"
if { $a == 1 && ($b == 1 || [string compare -nocase $c "Start"] == 0) } {
    puts Works
}
Run Code Online (Sandbox Code Playgroud)

所述-nocase开关可以确保它使用区分大小写的比较作为文档中提到.


另一种方法是制作$c统一的箱子并使用Start统一的箱子.例如,您可以将所有内容转换为小写:

set a 1
set b 0
set c "Start"
if { $a == 1 && ($b == 1 || [string tolower $c] == "start") } {
    puts Works
}
Run Code Online (Sandbox Code Playgroud)

或大写......

set a 1
set b 0
set c "Start"
if { $a == 1 && ($b == 1 || [string toupper $c] == "START") } {
    puts Works
}
Run Code Online (Sandbox Code Playgroud)

regexp如果您不介意"探索"该区域,可以选择另一种方法.

set a 1
set b 0
set c "Start"
if { $a == 1 && ($b == 1 || [regexp -nocase -- {^Start$} $c]) } {
    puts Works
}
Run Code Online (Sandbox Code Playgroud)

regexp返回1匹配和0不匹配.在^$确保整个Start是对匹配$c变量.结论,如果$c是相同的Start,你得到1.

  • 如果我们耗尽所有可能性:`regexp {(?i)^ start $} $ c` (2认同)
  • `string equals -nocase`也会提到. (2认同)