我正在尝试找到如下模式匹配
abc(xxxx):efg(xxxx):xyz(xxxx)
其中xxxx
- [0-9]位数
我用过
set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)"
regexp abc(....):efg(....):xyz(....) $string result_str
它返回0.有人可以帮忙吗?
答案 0 :(得分:2)
您遇到的问题是(
和)
对Tcl(以及许多其他RE引擎)中的正则表达式具有特殊含义,因为它们表示捕获子RE。要使字符“正常”,必须使用反斜杠进行转义,这意味着最好将正则表达式放在大括号中(因为反斜杠是常规的Tcl元字符)。
因此:
% set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)"
% regexp {abc\(....\):efg\(....\):xyz\(....\)} $string
1
如果你想也捕获这些括号的内容,你需要一个稍微复杂的RE:
regexp {abc\((....)\):efg\((....)\):xyz\((....)\)} $string \
all abc_bit efg_bit xyz_bit
请注意,那些....
序列总是匹配四个字符,但最好更具体一些。在每种情况下匹配任意数量的数字:
regexp {abc\((\d+)\):efg\((\d+)\):xyz\((\d+)\)} $string -> abc efg xyz
当使用regexp
提取字符串的位时,将->
用作整个字符串匹配的(相当奇怪的)变量名称是很常见的;它看起来像是在说“将提取的碎片发送到这些变量”。
答案 1 :(得分:0)
不适用于tcl但似乎需要转义(
和)
。此外,如果您确定x
的数字是数字,请使用\d{4}
代替....
。基于此,您可以尝试更新的正则表达式
abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)
。