/ / TCL Aspettatevi di usare le espressioni regolari per estrarre la stringa - le espressioni regolari, tcl, si aspettano

TCL si aspetta che usi le espressioni regolari per estrarre la stringa - le espressioni regolari, tcl, si aspettano

Sto cercando di estrarre le stringhe da un file che corrisponde al seguente formato:

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

Ad esempio: AP30f7.0df6.e51c

Il codice sottostante cattura tutti i dati che condividono la stessa riga della stringa precedente. Cosa posso fare per interrompere l'acquisizione di dati indesiderati trovati sulla stessa riga della stringa sopra?

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

AGGIORNARE:

Trovato un lavoro in giro. Poiché ogni riga corrispondente alla condizione che ho specificato inizia con la stringa desiderata, userò il intervallo di stringhe comando per estrarre solo i primi 16 caratteri.

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

risposte:

1 per risposta № 1

Il switch il comando ha alcune opzioni utili quando si desidera eseguire l'estrazione contemporaneamente alla corrispondenza di una RE. In particolare, dovresti usare il -matchvar opzione.

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

Ci sono alcuni ulteriori esempi su quella pagina di manuale.