? - مطابقت با یک عنصر صفر یا یک بار
این کمیت در واقع به این معنی است که "عنصر قبلی را اختیاری کنید." فرض کنید میخواستیم یک شماره تلفن را از نظر اعتبار بررسی کنیم و اگر شماره تلفنی با یکی از این دو شکل مطابقت داشته باشد، معتبر میدانیم:
(nnn) nnn-nnnn nnn nnn-nnnn
جایی که "n” یک عدد است. ما می توانیم یک عبارت منظم مانند این بسازیم:
^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
در این عبارت، کاراکترهای پرانتز را با علامت سوال دنبال می کنیم تا نشان دهیم که آنها باید با صفر یا یک بار مطابقت داشته باشند. باز هم از آنجایی که پرانتزها معمولاً هستند
متاکاراکترها (در ERE)، ما قبل از آنها با اسلش معکوس می گذاریم تا به جای آن، آنها را به صورت واقعی در نظر بگیریم.
بیایید آن را امتحان کنیم:
[me@linuxbox ~]$ echo "(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
[me@linuxbox ~]$ echo "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
[me@linuxbox ~]$ echo "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]$'
[me@linuxbox ~]$
[me@linuxbox ~]$ echo "(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
[me@linuxbox ~]$ echo "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
[me@linuxbox ~]$ echo "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]$'
[me@linuxbox ~]$
در اینجا می بینیم که عبارت با هر دو شکل شماره تلفن مطابقت دارد، اما با یکی از کاراکترهای غیر عددی مطابقت ندارد.