如何编写正则匹配TCL文件中存在未闭合左花括号的行
TCL 未闭合左花括号行匹配方案
需求说明
逐行解析TCL文件时,需要筛选出存在未闭合左花括号的行,用于和下一行合并读取,排除所有左花括号已完全闭合的行。
解决方案
方案一:统计括号数量(推荐,逻辑清晰无边界问题)
直接统计单行内左右花括号的数量,只要左花括号数量大于右花括号,就说明存在未闭合的左括号:
# 定义判断函数 proc has_unclosed_brace {line} { set left_cnt [regexp -all {\{} $line] set right_cnt [regexp -all {\}} $line] return [expr {$left_cnt > $right_cnt}] }
测试效果
# 测试用例1:括号已闭合,预期返回0 % set a "test_command -switch1 {bye }" test_command -switch1 {bye } % has_unclosed_brace $a 0 # 测试用例2:括号未闭合,预期返回1 % set b "test_command -switch1 {hi" test_command -switch1 {hi % has_unclosed_brace $b 1
该方案支持嵌套花括号的场景,比如行内容为cmd -a { -b {,也会正确返回1。
方案二:单条正则实现
如果需要用单条正则直接判断,可使用如下写法:
regexp {^[^{}]*\{(?:[^{}]*|\{[^{}]*\})*[^{}]*$} $line
该正则的匹配逻辑为:行内可以包含任意组成对出现的花括号,但最终存在至少一个没有对应右花括号的左花括号,测试效果和方案一完全一致。
内容的提问来源于stack exchange,提问作者Alan Saldanha
相关产品推荐
相关产品推荐

