我必须划分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。
答案 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地址会遇到很多问题。
答案 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");
}
}