TCL中的正则表达式:仅允许数字0-9和一个特殊字

时间:2017-02-28 19:16:19

标签: regex tcl

我想使用正则表达式检查表列表中的用户输入。 通常,我只想使用以下数字0-9

   $w configure -invalidcommand bell -validate key -validatecommand  {regexp {^[0-9]*$} %S}

工作正常。现在我想将此表达式扩展为仅允许数字0-9或确切的单词“Rigid”。我尝试了这个,但它允许我输入任何内容。

$w configure -invalidcommand bell -validate key -validatecommand  {regexp {regexp {^([0-9])|^Rigid?\>*$} %S}

3 个答案:

答案 0 :(得分:3)

您可以考虑将验证码放入proc:

$w configure -invalidcommand bell -validate key -validatecommand  {validate %S}

proc validate {data} {
    return [regexp {^(?:[0-9]*|Rigid)$} $data]
    # or
    return [expr {$data eq "Rigid" || [string is integer $data]}]
}

答案 1 :(得分:1)

^([0-9])|^Rigid?\>*$模式允许匹配超出您需要的匹配,因为^仅适用于([0-9]),一个数字,因此第一个字符应该是一个数字,其余的可以是任何。 ^Rigid?\>*$匹配以Rigi开头的字符串,后面可能有d,然后有0 + >个符号。

你需要

{^(?:[0-9]*|Rigid)$}

这里,锚点应用于两个模式,只允许0+数字或Rigid作为整个字符串。

答案 2 :(得分:0)

$ w configure -invalidcommand bell -validate key -validatecommand {regexp {^ [0-9] * $}%S}

  
    

这将允许null或“0-9范围内的一个或多个数字”。

  

要确保至少1位数,请使用+而不是*。

现在回答你的问题 - 允许数字0-9或确切的单词“Rigid”

  
    

使用{(^ [0-9] + $ | ^ Rigid $)}

  

让网站成为我刚刚尝试过的一个例子:

设置[获取标准输入]

if {[regexp - {(^ [0-9] + $ | ^ Rigid $)} $ a]} {     把“是” } else {     把“不” }

输出:

  
    

$ tclsh test1     12     是     $ tclsh test1     死板     是     $ tclsh test1     死板     没有     $ tclsh test1     32瓦特     没有     $ tclsh test1

  

没有

  
    

$

  

格式的道歉。 enter image description here