TCL正则表达式匹配异常求助:指定格式字符串匹配失败
问题分析与解决方案
我看了你的TCL代码和匹配需求,问题出在正则表达式没有完全覆盖目标字符串的结构,尤其是{前后的空格以及结尾的空格部分。
问题根源
你的目标字符串是: cell(HEADBUFTIE42D_D3_N_M7P5TR_C60L08) {,它的关键结构是:
- 开头恰好2个空格
cell(...)部分,括号是字面量字符)后接1个空格,然后是{{后接1个空格,字符串到此结束
而你原来的正则表达式^ +cell[(]$cell$postfix[)] *\{只匹配到{就结束了,没有覆盖{后面的空格,也没有明确匹配字符串结尾,所以无法成功匹配整个目标串。
修正后的代码
下面是调整后的正则表达式,完全匹配你描述的结构:
set cell "HEADBUFTIE42D_D3_N" set postfix "_M7P5TR_C60L08" set line " cell(HEADBUFTIE42D_D3_N_M7P5TR_C60L08) { " # 修正后的正则表达式 if {[regexp "^ {2}cell\($cell$postfix\) \{ $" $line match]} { puts "hello" }
正则说明
^ {2}:精确匹配开头的2个空格,比^ +更贴合你“开头包含2个空格”的需求(如果允许开头有更多空格,可换回^ +)\(和\):转义括号,因为括号在正则中是特殊分组字符,必须转义才能匹配字面量的括号(也可以用[(]和[)]替代,效果一致)\{:匹配)与{之间的1个空格,以及{后面的1个空格$:匹配字符串结尾,确保整个line完全符合模式,而不是仅包含匹配的子串
另一种写法(用字符集替代转义)
如果你觉得转义字符看着麻烦,也可以用字符集来匹配括号,效果相同:
if {[regexp "^ {2}cell[(]$cell$postfix[)] \{ $" $line match]} { puts "hello" }
现在运行这段代码,就能成功输出hello了。
内容的提问来源于stack exchange,提问作者harsha
相关产品推荐
相关产品推荐

