TCL脚本重要的功能,正则匹配。非常好使用,可进行数据有效性校验或者匹配。从一个应用例子开始。
上面使用的函数regexp即正则表达匹配函数,正则表达式的语法可查网络,或者直接问AI。上面简洁的一行文字,很好的检测输入字符串的合法性。当前匹配时,返回1,否则返回-0。例如网络名称合法性。上述例子中,要求字符串包含字母、数字、下划线以及空格,允许一个或者多个这样的字符(由+来表达),其中^表示开始,$表示结尾。
再看一个例子。使用正则表示式进行窗口大小参数的匹配,并取得数据,存入对应变更应用使用。
set mygeometry [wm geometry .lOffpageCheckDlg]
set lResult [regexp -- {([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)} $mygeometry \
-> width height decorationLeft decorationTop]
puts $width
puts $height
puts $decorationLeft
puts $decorationTop
再看例子:用于匹配总线类型的网络名等,例如网络BUS[15:0]
可分别匹配得到prefix=“BUS ”,str1=15,str2=0
再看例子,匹配形如data12数据,分别可取得前缀与后续
if { [regexp {(\w*[A-Za-z_\-+])(\d*)$} $lNet -> prefix1 suffix1] }
这么有用的正则表达式,看不懂,如何写,交给chatGPT好了。
最后给一个数据有效性的代码结尾,该例子检查自动生成编号的检查,使用了正则表达式。TK窗口设计时,控件entry可用于录入信息,第一个enrty,它提供了有效性检查的命令接口,将我们检查数据有效的的函数连接上去就可以了。
entry .customNetForm.grpCntEntry -width 5 -validatecommand {::customNetsApp::grpSizeCheck} -validate focusout
entry .customNetForm.arrSzEntry -width 5 -validatecommand {::customNetsApp::arraySzCheck} -validate focusout
proc ::customNetsApp::CheckAutoChangeField { lstart lcnt lMode} {
set RSLT_ALPHABET 2
set RSLT_NUMBER 1
set RSLT_INVALID -1
set M1_ASCENDING 2
set M1_DESCENDING 1
set M1_NONE 0
set M2_ASCENDING 4
set M2_DESCENDING 3
set input_string [string toupper $lstart]
# when it is a alphebet
if {[regexp {^([A-Z])$} $input_string] } {
set startChar [scan $input_string %c]
if { $lMode == $M1_DESCENDING || $lMode == $M2_DESCENDING } {
set endChar [scan "A" %c]
} else {
set endChar [scan "Z" %c]
}
set distance [expr abs($endChar - $startChar) +1]
if { $distance < $lcnt} {
set error "Error, the gap between the last and the beginning is less than $lcnt"
puts $error
.customNetForm.label configure -text $error
return $RSLT_INVALID
} else {
return $RSLT_ALPHABET
}
} elseif {[regexp {^([0-9]+)$} $input_string] } {
set num [scan $input_string %d]
if { $lMode == $M1_DESCENDING || $lMode == $M2_DESCENDING } {
set zero [scan "0" %d]
set distance [expr ($num - $zero) +1]
if { $distance < $lcnt} {
set error "Error, the gap between 0 and $input_string is less than $lcnt"
puts $error
.customNetForm.label configure -text $error
return $RSLT_INVALID
} else {
return $RSLT_NUMBER
}
} else {
return $RSLT_NUMBER
}
} else {
set error "ERROR, a valid string: $input_string"
puts $error
.customNetForm.label configure -text $error
return $RSLT_INVALID
}
}