我试图找到一种模式匹配如下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谁能帮助?
我试图找到一种模式匹配如下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的正则表达式(和除了许多其他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它在说“送提取到这些变量的作品”。
不与TCL的工作,但好像你需要逃避(
和)
。 此外,如果你确信该x
的将是数字,使用\d{4}
而不是....
。 在此基础上,更新的正则表达式,你可以尝试是
abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)
。