؟ - تطابق عنصر صفري أو مرة واحدة
يعني هذا المُحدِّد الكمي ، في الواقع ، "جعل العنصر السابق اختياريًا". لنفترض أننا أردنا التحقق من رقم الهاتف للتأكد من صحته واعتبرنا رقم الهاتف صالحًا إذا كان يطابق أيًا من هذين النموذجين:
(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 ~] $ صدى "(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 ~] $ صدى "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 ~] $ صدى "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 ~] $ صدى "(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 ~] $ صدى "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 ~] $ صدى "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 ~] $
نرى هنا أن التعبير يطابق كلا شكلي رقم الهاتف ، لكنه لا يتطابق مع التعبير الذي يحتوي على أحرف غير رقمية.