0

次の形式に一致するファイルから文字列を抽出しようとしています。

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
        }
    }
}
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 に答える