TCL正则表达式模式搜索

时间:2012-08-16 08:53:59

标签: 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.有人可以帮忙吗?

2 个答案:

答案 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}\)