1

我正在尝试找到如下模式匹配 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。有人可以帮忙吗?

4

2 回答 2

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用于提取字符串的位时,将其->用作整个字符串匹配的(相当奇怪的)变量名是很常见的;它看起来像是在说“将提取的片段发送到这些变量”。

于 2012-08-16T09:33:52.747 回答
0

未与 tcl 一起使用,但似乎您需要转义(and )。此外,如果您确定x's 将是数字,请使用\d{4}而不是..... 基于此,您可以尝试的更新正则表达式是

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

于 2012-08-16T08:59:09.820 回答