Orcad TCL脚本编程中正则表达式的运用

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

    }

}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值