TCL正则表达式模式搜索(TCL regexp pattern search)

2019-09-30 04:33发布

我试图找到一种模式匹配如下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谁能帮助?

Answer 1:

你得到的问题是, ()有特殊意义的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来提取字符串的位,这是很常见的使用->作为整个字符串匹配一个(很奇怪)变量名; 它看起来像mnemonically它在说“送提取到这些变量的作品”。



Answer 2:

不与TCL的工作,但好像你需要逃避() 。 此外,如果你确信该x的将是数字,使用\d{4}而不是.... 。 在此基础上,更新的正则表达式,你可以尝试是

abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)



文章来源: TCL regexp pattern search
标签: regex tcl