اذهب إلى المحتوى
  • 0

إشكالية معينة في طريقة عمل التعابير النمطية في جافا سكريبت

مصطفى اوريك

السؤال

إذا قمت بعملية Validate لهذا البريد الإلكتروني على سبيل المثال: 434user@gmail.com

باستخدام هذا الـ Pattern:

/(^[0-9].*)@(^[0-9]+.*)\.(\w{2,})/i

يتم إرجاع قيمة true (أي أن هذا البريد الإلكتروني متوافق مع هذا الـ Pattern)

بينما باستخدام هذا الـ Pattern:

/(\D+.*)@(\D+.*)\.(\w{2,})/i

يتم إرجاع قيمة false

لماذا يحدث هذا ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0
بتاريخ 5 دقائق مضت قال مصطفى اوريك:

@Chihab Hedidi أخطأت في سؤالي, ما أقصده حقا وباختصار هو أن هذا الكود يقوم بارجاع true ولا أعلم لماذا, علما أن \D يفترض أن يشير إلى جميع الأحرف إلى الأرقام

let p = /(\D+.*)@(\D+.*)\.(\w{2,})/i;
let email = "43ffdfsdf@gmail.com";

console.log(p.test(email)); // true

 

(\D+.*) يتحقق لأنو القيمة تحتوي على حروف وليس شرط أن تكون الحروف في البداية، لكن إذا كنت تريد أن تضمن أنه لا يجب  أن تكون الأرقام في البداية يمكنك تغييره هكذا:

/^[^0-9].*@(\D+.*)\.(\w{2,})/i

أو تضيف ^ في النمط الخاص بك لأن هذا الرمز يشير إلى البداية، أي بهذه الطريقة نضمن أن البداية تكون حرف:

/^(\D+.*).*@(\D+.*)\.(\w{2,})/i

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

السبب في الاختلاف في النتائج بين النمطين هو الاختلاف في النمط الذي يتم تحديد البريد الإلكتروني به.

 النمط الأول يحتوي على هذا الجزء (^[0-9].*) و يعني أن النص يجب أن يبدأ برقم، لذلك يتطابق مع الأرقام فقط، و هذا ما يحتويه الإيمايل الذي وضعته لذلك يرجع لك true.
بينما النمط الثاني يبدأ ب (\D+.*) و يعني أنه يتوقع أي حرف غير رقمي متبوعا بأي شيء (أي حرف غير رقمي متكرر)، لهذا يتم إرجاع قيمة false.

يعني الفرق الرئيسي بين النمطين هو استخدام [0-9] في النمط الأول للتطابق مع الأرقام فقط، بينما يستخدم \D في النمط الثاني للتطابق مع أي حرف غير رقمي.

و لفهم التعابير النمطية أكثر يمكنك الإطلاع على هذه المقالة التي ستساعدك بشكل أفضل:

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

@Chihab Hedidi أخطأت في سؤالي, ما أقصده حقا وباختصار هو أن هذا الكود يقوم بارجاع true ولا أعلم لماذا, علما أن \D يفترض أن يشير إلى جميع الأحرف إلا الأرقام

let p = /(\D+.*)@(\D+.*)\.(\w{2,})/i;
let email = "43ffdfsdf@gmail.com";

console.log(p.test(email)); // true

 

تم التعديل في بواسطة مصطفى اوريك
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

فكر بالأمر على أنّ التعبير النمطي يبحث عن نمط معين بالسلسلة النصية، والنمط لديك موجود لذا يرجع True، لكن لماذا؟

لأن \D يشير إلى جميع الأحرف باستثناء الأرقام، لكنه يُستخدم مع المشغل +، مما يجعل الأمر مختلفًا.

فتعبير \D+.* يبحث عن مجموعة واحدة أو أكثر من أي حرف باستثناء الأرقام، متبوعًا بأي عدد من الأحرف (.*).

لذا، فهو يتطابق مع أي بريد إلكتروني يبدأ بأي حرف باستثناء رقم، ثم يتبعه أي عدد من الأحرف، ثم @، ثم أي حرف باستثناء رقم، ثم يتبعه أي عدد من الأحرف، ثم .، ثم أي حرفين على الأقل (لأن \w يطابق أي حرف أو رقم أو سطر سفلي).

في email، يتطابق التعبير مع "43ffdfsdf" (الحرف الأول ليس رقمًا، ثم يتبعه أي عدد من الأحرف) و "gmail" (أي حرف باستثناء رقم، ثم يتبعه أي عدد من الأحرف) و "com" (حرفين على الأقل).

بالتالي، فإن p.test(email) يُرجع true لأن التعبير \D+.* يطابق البريد الإلكتروني "43ffdfsdf@gmail.com".

من الأفضل استخدام regex101.com لإختبار النمط، أدخل التعبير \D+.* وقم بتجربته مع مختلف عناوين البريد الإلكتروني.

وفي حال تريد التأكد من أن البريد الإلكتروني لا يبدأ برقم، فنستخدم التعبير التالي:

let p = /^[^0-9].*@\S+\.\w{2,}$/i;

وهو يتطابق مع أي بريد إلكتروني، يتصف بالتالي:

  • لا يبدأ برقم (^[^0-9])
  • يحتوي على @
  • لا يحتوي على مسافات بيضاء (/\S+/)
  • ينتهي بـ . وحرفين على الأقل (\w{2,})

لذا النمط التالي سيرجع نتيجة Flase:

let p = /^[^0-9].*@\S+\.\w{2,}$/i;
let email = "43ffdfsdf@gmail.com";

console.log(p.test(email)); // false

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...