Espressione regolare per trovare stringa nel Aspettatevi tampone
Domanda
Sto cercando di trovare un'espressione regolare che lavora per abbinare una stringa di caratteri di escape (una risposta Expect, vedere questa domanda ) e un numero di sei cifre (primo carattere alfanumerico).
Ecco l'intera stringa ho bisogno di identificare:
\r\n\u001b[1;14HX76196
In definitiva ho bisogno di estrarre la stringa:
X76196
Ecco quello che ho già:
interact {
#...
#...
#this expression does not identify the screen location
#I need to find "\r\n\u001b[1;14H" AND "([a-zA-Z0-9]{1})[0-9]{5}$"
#This regex was what I was using before.
-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
set number $interact_out(0,string)
}
Ho bisogno di identificare i caratteri di escape per verificare che si tratta di un campo in quella regione dello schermo. Così ho bisogno di un'espressione regolare che include tale prima parte, ma le barre inverse mi sono confuse ...
Anche una volta che ho la stringa completa nella variabile $ numero, come faccio a isolare solo il numero in un'altra variabile in Tcl?
Soluzione 2
ho scoperto un paio di cose con un po 'di scavo. Prima di tutto io non guardavo all'uscita del programma, ma l'input dell'utente. Avevo bisogno di aggiungere il "-o" bandiera a guardare il programma di uscita. Ho anche ridotto la regex per solo la parte necessaria.
L'esempio espressione regolare da @rikh mi ha portato a capire perché il suo o il mio regex stava fallendo, e che è stato a causa del fatto che io non guardavo in uscita, ma l'ingresso. Così l'espressione regolare originale che ho provato non era in colpa, ma i dati di essere guardato (manca il flag "-o")
Ecco la risposta completa al mio problema.
interact {
#...
-o -nobuffer -re {(\[1;14H[a-zA-Z0-9]{1})[0-9]{5}} {
#get number in place
set numraw $interact_out(0,string)
#get just number out
set num [string range $numraw 6 11]
#switch to lowercase
set num [string tolower $num]
send_user " stored number: $num"
}
}
Sono un niubbo con Expect e Tcl , quindi se tutto questo non ha senso, o se avete altre intuizioni le bandiere Interact, impostare me dritto.
Altri suggerimenti
Se si desidera solo il numero alla fine, allora questo dovrebbe essere sufficiente ...
[0-9]{6}
Aggiornamento con nuove informazioni
Supponendo \ n è un carattere di nuova linea, piuttosto che un letterale \ seguito da un n letterale, si può fare questo ...
\r\n\u001B\[1;14H(X[0-9]{5})