我的IPv6地址为
> puts $addr
3ffe:0:4:ff00::fc:5
我想将其分为两组
我尝试了“ split”命令,但是它不起作用。正则表达式给出以下结果:
> regexp -all -- {(\S+)[set z](\S+)} $addr match g1 g2
1
> puts $g1
3ff
> puts $g2
:0:4:ff00::fc:5
有人建议拆分它们吗?
答案 0 :(得分:3)
使用textutil::split
package from tcllib
$ tclsh
% package require textutil::split
0.8
% set parts [::textutil::split::splitx "3ffe:0:4:ff00::fc:5" "::"]
3ffe:0:4:ff00 fc:5
答案 1 :(得分:2)
split
仅分割成一个字符。您可以做的就是将::
交换到其他对象上,并拆分成其他对象。例如,假设不可能在字符串中包含字符@
,所以您可以先替换它,然后在@
上分割:
% set sub [string map {"::" "@"} $addr]
3ffe:0:4:ff00@fc:5
% set groups [split $sub "@"]
3ffe:0:4:ff00 fc:5
否则,如果要使用正则表达式,则可以匹配:
% regexp {(.+)::(.+)} $addr - part1 part2
1
% puts $part1
3ffe:0:4:ff00
% puts $part2
fc:5
您使用的(\S+)[set z](\S+)
表达式实际上尝试按以下顺序进行匹配:
s
,e
,t
,<space>
或z
中的任何一个字符因此(\S+)
将与(3ff)
相匹配,[set z]
将与e
相匹配,而(\S+)
将与字符串的其余部分相匹配。如果要让变量z
包含在变量中,则需要使用更多类似的内容(大括号可防止替换[set z]
和\
,但引号不能替代,因为结果,如果允许替换,则必须转义反斜杠):
regexp "(\\S+)[set z](\\S+)" $addr match g1 g2
或
regexp "(\\S+)${z}(\\S+)" $addr match g1 g2
我删除了-all
标志,因为只有一个匹配项,所以在这种情况下,虽然可以保留--
答案 2 :(得分:0)
有人建议拆分它们吗?
使用string map
保持简单:
% set addr 3ffe:0:4:ff00::fc:5
3ffe:0:4:ff00::fc:5
% lassign [string map {:: " "} $addr] pt1 pt2
% puts $pt1
3ffe:0:4:ff00
% puts $pt2
fc:5