TCL regexp模式搜索

TCL regexp模式搜索,regex,tcl,Regex,Tcl,我试图找到一个模式匹配如下 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。有人能帮忙吗?没有使用tcl,但似乎您需要避开(和)。另外,如果您确定x是数字,请使用\d{4}而不是…。基于此,您可以尝试更新的正则表达式是

我试图找到一个模式匹配如下
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。有人能帮忙吗?

没有使用tcl,但似乎您需要避开
。另外,如果您确定
x
是数字,请使用
\d{4}
而不是
。基于此,您可以尝试更新的正则表达式是


abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)
问题是,
对Tcl(以及其他许多RE引擎)中的正则表达式具有特殊意义,因为它们表示捕获子RE。要使字符“正常”,必须使用反斜杠对其进行转义,这意味着最好将正则表达式放在大括号中(因为反斜杠是一般的Tcl元字符)

因此:

如果还希望捕获这些括号的内容,则需要稍微复杂一些的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
提取字符串位时,使用
->
作为整个字符串匹配的(相当奇怪的)变量名是很常见的;从助记符的角度看,它好像在说“将提取的片段发送到这些变量”。

这失败了。当我尝试使用字符串abc(12):efg(78)regexp abc(..):efg(..)时,它可以工作。不确定是什么原因导致了四位数字的问题。对不起,我认为您问题中的
xxxx
正好是四位数字。如果它可以是任意数量的数字,那么在正则表达式中将
\d{4}
替换为
\d+
。同样根据您评论中的示例,似乎
abc(xxx)
可以重复任意次数(在您的问题中,您使用了
abc…efg…xyz…
)。你能澄清一下吗?如果需要的话,我可以更新答案。答案只有四位数。我使用了abc(+):efg(+):xyz(+)。它起作用了。。但不确定这是否是一种安全的方法。当以交互方式进行测试时,
regexp-inline
非常有用,因为它会返回所有匹配子字符串的列表,而不是是否找到匹配项。感谢Donal和其他人的宝贵建议。非常感谢。
regexp {abc\((\d+)\):efg\((\d+)\):xyz\((\d+)\)} $string -> abc efg xyz