<Precedenti | Contenuti | Succ.>
? - Abbina un elemento zero o una volta
Questo quantificatore significa, in effetti, "Rendi facoltativo l'elemento precedente". Supponiamo di voler verificare la validità di un numero di telefono e di considerare valido un numero di telefono se corrisponde a una di queste due forme:
(nnn) nnn-nnnn nnn nnn-nnnn
dove "n" è un numero. Potremmo costruire un'espressione regolare come questa:
^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
In questa espressione, seguiamo i caratteri delle parentesi con punti interrogativi per indicare che devono essere abbinati zero o una volta. Di nuovo, poiché le parentesi sono normalmente
metacaratteri (in ERE), li facciamo precedere da barre rovesciate per far sì che vengano trattati come letterali.
Proviamolo:
[io@linuxbox~]$ eco "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]
\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
[io@linuxbox~]$ eco "555 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
555 123-4567
[io@linuxbox~]$ eco "AAA 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
[io@linuxbox~]$
[io@linuxbox~]$ eco "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]
\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
[io@linuxbox~]$ eco "555 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
555 123-4567
[io@linuxbox~]$ eco "AAA 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
[io@linuxbox~]$
Qui vediamo che l'espressione corrisponde a entrambe le forme del numero di telefono, ma non a quella contenente caratteri non numerici.