我正在尝试从符合以下格式的文件中提取字符串:
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
}
}
}
答案 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
}
}
}
该手册页上还有一些其他示例。