TCL 正则表达式 trim 来自特定特殊字符的字符串

TCL Regular expression to trim the string from specific special character

我的 TCL 正则表达式如下

regexp {((\d:[\da-zA-Z]+))} "3001:470:8865:2E01::190:201" out

out的当前值为完整的字符串

3001:470:8865:2E01::190:201

我想要::

之前的字符串
3001:470:8865:2E01

这将捕获 :: 之前的所有内容:(.*)::

参见:https://regex101.com/r/LzqnmZ/1

要在 :: 处停止 RE,请使用前瞻:

regexp {.*(?=::)} "3001:470:8865:2E01::190:201" out

如果 RE 不匹配,则不会写入 out 变量。

或者,删除您不想要的内容:

regsub {::.*} "3001:470:8865:2E01::190:201" {} out

puts $out  ;# ==> 3001:470:8865:2E01

您可以在字符串的开头匹配 single-colon 个分隔的字母数字字符块:

regexp {^\w+(?::\w+)*} "3001:470:8865:2E01::190:201" out
puts $out

输出:3001:470:8865:2E01

Tcl demo online and the regex demo。详情:

  • ^ - 字符串开头
  • \w+ - 一个或多个字母、数字或下划线
  • (?::\w+)* - 出现零次或多次冒号,然后是一个或多个字母、数字或下划线。

如果您只想匹配字母和数字,您也可以考虑将 \w 模式精确到 [\dA-Za-z],并将第一个 \w+ 替换为 \d+

regexp {\d+(?::[\dA-Za-z]+)*} "3001:470:8865:2E01::190:201" out

this Tcl demo and this regex demo