使用零或一匹配在regex中设置变量

时间:2016-04-12 06:27:13

标签: regex tcl

我必须划分ip-address和port并使用此代码

set str 192.168.1.1:44
set port 23
regexp {(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d+)?} $str all ip port
puts $ip
puts $port

它完美无缺。但是如果使用没有端口的 $ str (例如192.168.1.1),则没有设置任何变量,TCL会返回错误。

can't read "ip": no such variable

正则表达式仍匹配" 192.168.1.1"没有端口(我用&#34检查;如果"语句),没有端口,但为什么它不返回变量?我期待$ all和$ ip。

3 个答案:

答案 0 :(得分:2)

set str 192.168.1.1:44
lassign [split $str :] ip port
if {$port eq ""} {
    set port 23
}
puts $ip
puts $port

如果您需要验证$ip字符串是否是有效的IP地址,那么使用ip包比使用正则表达式更好(您使用的正则表达式将接受很多无效的IP地址。)

请注意,IPv6地址会遇到很多问题。

文档:iflassignputssetsplitip

答案 1 :(得分:1)

你应该使冒号可选并在不同的组中捕获正则表达式。

正则表达式: ^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::?(\d+))?$

<强>解释

  • 在第一组中捕获IP地址。

  • 在第二组中捕获可选端口号。 :是非捕获组的一部分,因此不会在第二组中捕获。

<强> Regex101 Demo

答案 2 :(得分:1)

static
    {
        if(!OpenCVLoader.initDebug()){
            Log.d("DD", "Failed");
        }
        else
        {
            Log.d("DD", "SUCCESS Opencv");
        }
    }