2013-06-10 19 views
22

Ciao comunità fantastica,Espressione regolare in Bash Script

Sono una droga completa quando si tratta di regex. Ho rimandato l'apprendimento ... e ora la mia pigrizia mi ha raggiunto.

quello che sto cercando di fare:
Verificare se una stringa corrisponde a questo formato:

10_06_13 

es. data odierna o una data simile con "2digits_2digits_2digits"

Quello che ho fatto:

regex='([0-9][0-9][_][0-9][0-9][_][0-9][0-9])' 
if [[ "$incoming_string" =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

Questo funziona in una certa misura. Ma quando la stringa entrante è uguale a 011_100_131 ... continua a superare il controllo regex.

Sarei grato se qualcuno potesse aiutarmi a indicarmi la giusta direzione.
Acclamazioni

+1

Si noti che i caratteri di sottolineatura non devono essere racchiusi tra parentesi quadre. '_' corrisponde alla stessa cosa di' [_] '. – chepner

+2

011_100_131 non corrisponde alla tua espressione regolare. 011_10_131 sarebbe. – hop

risposta

35

=~ riesce se la stringa a sinistra contiene un match per il regex sulla destra. Se volete sapere se la stringa corrisponde la regex, è necessario "ancorare" l'espressione regolare su entrambi i lati, in questo modo:

regex='^[0-9][0-9][_][0-9][0-9][_][0-9][0-9]$' 
if [[ $incoming_string =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

L'^ riesce solo all'inizio della stringa, e il $ alla fine riesce solo

Note:

  1. ho tolto il superfluo () dalla regex e "" dal [[ ... ]].
  2. Il manuale di bash non è formulato correttamente, poiché indica che =~ ha esito positivo se la stringa corrisponde.
+0

Dannazione, ero così vicino! Supponevo che "^" escludesse i personaggi. Grazie mille! :) – Robbie

+7

@Robbie: '^' significa "escluso" quando è la prima cosa in un set di caratteri ('[...]'), e significa "ancorato" quando è la prima cosa in un modello. Altrimenti, corrisponde semplicemente a '^' (ma ciò non è vero in tutte le implementazioni regex, a volte significa "corrisponde all'inizio di una riga"). Sono d'accordo che è confuso fino a quando non ci si abitua. – rici

+0

Ottimo! Molto utile, grazie ancora. Meritato meritatamente! – Robbie