正则表达式定界符“ ::” Tcl

时间:2018-10-10 20:34:48

标签: regex tcl

我的IPv6地址为

> puts $addr
3ffe:0:4:ff00::fc:5

我想将其分为两组

  • 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

有人建议拆分它们吗?

3 个答案:

答案 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+)表达式实际上尝试按以下顺序进行匹配:

  1. 非空格字符
  2. set<space>z中的任何一个字符
  3. 非空格字符

因此(\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
相关问题