0

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

AP[1st nibble].[2nd nibble].[3rd nibble]

例如: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
        }
    }
}
4

1 回答 1

1

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

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
        }
    }
}

该手册页上还有一些进一步的示例。

于 2013-06-23T11:01:35.357 回答