'在Tcl脚本中无效的单词“regexp”

时间:2015-01-25 14:26:17

标签: regex tcl bareword

proc mulval { addr } {

if {regexp {^([2][2-3][0-9])\.+(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-])\.+(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.+(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$} $addr } {
        puts "Valid IP Multicast Address"
    } else { 
        puts"Invalid IP multicast Address"
    }

}

以上代码生成错误无效的赤字" regexp"在tcl。

我想知道这个词中的错误是什么,以及tcl中的无效裸字是什么。如何调试。

2 个答案:

答案 0 :(得分:1)

它不是来自你的正则表达式。这是一个Tcl语法问题。你应该写:

if { [ regexp {^([2][2-3][0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$} $addr ] } {
    puts  "Valid IP Multicast Address" 
} else { 
    puts  "Invalid IP multicast Address"
}

方括号表示必须将内容视为可执行命令。

答案 1 :(得分:1)

错误是regexp被写为if的第一个参数内的非限定字符串。如果要在condition参数中将命令的结果作为操作数,则需要在其周围放置括号:[regexp ...]

但是你不应该使用正则表达式来验证IP号码。虚线十进制只是编写IP编号的许多可能方法之一,并且尝试使用正则表达式对它们进行排序将会很痛苦且容易出错。

请改用ip模块。我不是知识产权专家,但以下情况应该有效:

package require ip

proc mulval addr {
    set mc [::ip::prefix 224/4]

    if {[::ip::equal $mc [::ip::prefix $addr/4]]} {
        puts "Valid IP Multicast Address" 
    } else { 
        puts "Invalid IP multicast Address"
    }
}

Tcllib ip module

的文档

文档:ifpackageprocputsset