TCL期望使用正则表达式提取字符串

时间:2013-06-23 06:18:37

标签: regex tcl expect

我正在尝试从符合以下格式的文件中提取字符串:

AP [第1个半字节]。[第2个半字节]。[第3个半字节]

例如:AP30f7.0df6.e51c

以下代码捕获与上述字符串共享同一行的所有数据。如何停止捕获与上述字符串在同一行中找到的任何不需要的数据?

while { [gets $fchan inline] >= 0} {
    switch -regexp -- $inline {
        AP([a-f0-9]{4}\.[a-f0-9]{4}\.[a-f0-9]{4}) {
            append default_name $inline\n
        }
    }
}

更新

找到了解决方法。由于符合我指定条件的每一行都以所需的字符串开头,因此我将使用 string range 命令仅提取前16个字符。

while { [gets $fchan inline] >= 0} {
    switch -regexp -- $inline {
        AP([a-f0-9]{4}\.[a-f0-9]{4}\.[a-f0-9]{4}) {
            set inline_mod [string range $inline 0 15]
            append default_name $inline_mod\n
        }
    }
}

1 个答案:

答案 0 :(得分:1)

当您想要在匹配RE的同时进行提取时,switch命令有一些有用的选项。特别是,您应该使用the -matchvar option

while { [gets $fchan inline] >= 0} {
    switch -regexp -matchvar matched -- $inline {
        AP([a-f0-9]{4}\.[a-f0-9]{4}\.[a-f0-9]{4}) {
            # Extract the first and second elements
            lassign $matched inline_mod triple
            # With your sample of AP30f7.0df6.e51c
            #   $inline_mod is "AP30f7.0df6.e51c"
            #   $triple is "30f7.0df6.e51c"
            append default_name $inline_mod\n
        }
    }
}

该手册页上还有一些其他示例。