我正在尝试找到如下模式匹配
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
用于提取字符串的位时,将其->
用作整个字符串匹配的(相当奇怪的)变量名是很常见的;它看起来像是在说“将提取的片段发送到这些变量”。
未与 tcl 一起使用,但似乎您需要转义(
and )
。此外,如果您确定x
's 将是数字,请使用\d{4}
而不是....
. 基于此,您可以尝试的更新正则表达式是
abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)
.