إن التعبير العادي الذي كلفني معظم الوقت هو الذي لم أكتبه. كان عمره أربع سنوات، وكان يجلس في طبقة التحقق من الصحة، وبدا وكأن قطة سارت عبر لوحة المفاتيح: مجموعات متداخلة، ونظرة أمامية، وفئتين من الشخصيات، و {2,} الاختباء في النهاية. قالت تذكرة الدعم إنها ترفض المدخلات الصحيحة، وقبل أن أتمكن من إصلاحها، كان علي أن أفهمها، مما يعني تشغيل المحرك عقليًا فوق النمط رمزًا واحدًا في كل مرة. هذه هي الضريبة التي يدفعها كل مطور على regex غير مألوف، وهي بالضبط الضريبة شرح regex تم تصميم Toolz.dev للإزالة. يدور هذا الدليل حول قراءة التعبيرات العادية بدلاً من فك تشفيرها، وكيف يحول انهيار رمز مميز جدارًا من الرموز إلى شيء يمكنك مراجعته مثل التعليمات البرمجية العادية.
ليرة تركية؛DR: يقوم شرح regex بتحليل تعبير عادي ويصف كل جزء باللغة الإنجليزية البسيطة، بالترتيب الذي يقرأه به المحرك: المراسي، وفئات الأحرف، ومحددات الكمية، والمجموعات، والمشاهدات، والهروب، وكلها ذات علامات ومسافة بادئة بحيث تكون البنية المتداخلة مرئية. ال شرح regex يتحقق من صحة النمط باستخدام محرك JavaScript الحقيقي ويقوم بالتعطل الكامل في متصفحك، دون تحميل أي شيء.
ما هو شرح regex؟
يأخذ شرح regex تعبيرًا عاديًا ويترجمه، بناءًا واحدًا في كل مرة، إلى وصف يمكنك قراءته. بدلا من التحديق في ^(?<user>[a-z0-9._%+-]+)@ وإعادة بناء معناها في رأسك، تحصل على قائمة مرتبة: هذه مرساة بداية السلسلة، وهذه مجموعة التقاط مسماة تسمى المستخدم، وهذه فئة أحرف تتطابق مع حرف صغير، أو رقم، أو نقطة، علامة النسبة المئوية، علامة الزائد، أو الواصلة، وهذا المحدد الكمي يعني مرة واحدة أو أكثر. لم يتغير النمط، ولكن جهد فهمه انتقل من رأسك إلى الأداة.
تأتي القيمة من حقيقة أن التعبيرات العادية مضغوطة بشكل متعمد. يحمل كل رمز معنى، ويمكن كتابة نفس القصد بعدة طرق مختلفة، لذلك لا توجد طريقة موثوقة لتصفح النمط بالطريقة التي تتصفح بها الوظيفة. شرطة مائلة عكسية ضالة واحدة تغير نقطة حرفية إلى "؛ أي حرف، "؛ ومحدد كمي جشع حيث تريد أن يغير الكسول النص الذي تلتقطه المجموعة. قراءة regex تعني بشكل صحيح محاكاة المحرك، ومحاكاة المحرك يدويًا بطيئة وعرضة للخطأ. يقوم المفسر بهذه المحاكاة ويظهر لك النتيجة.
في Toolz.dev، يكون التدفق قصيرًا. يمكنك لصق النمط بدون الخطوط المائلة المحيطة به، وتبديل العلامات التي يستخدمها، ويظهر الانهيار على الفور. يتم وضع مسافة بادئة للمجموعات المتداخلة بحيث يكون شكل النمط مرئيًا في لمحة، ويتم وصف كل علامة في السياق حتى تفهم كيف تغير المطابقة بأكملها بدلاً من بناء الجملة فقط.
كيف يختلف المفسر عن جهاز اختبار regex؟
تجيب هاتان الأداتان على أسئلة مختلفة، ومعرفة ما تحتاجه توفر الوقت. يقوم جهاز اختبار regex بتشغيل نمط مقابل نموذج النص ويظهر ما يطابقه: التطابقات المميزة ومجموعات الالتقاط وأي خطأ. يجيب ويقتبس؛ هل يفعل هذا النمط ما أريده في هذا الإدخال."؛ يصف أحد المفسرين ما يعنيه النمط دون أي إدخال اختبار على الإطلاق. يجيب ويقتبس؛ ما الذي يقوله هذا النمط بالفعل.&اقتباس؛
يمكنك الوصول إلى المفسر عندما يكون regex هو المجهول، وليس البيانات. إن مراجعة طلب السحب الذي يضيف نمط التحقق من الصحة، أو وراثة قاعدة تعليمات برمجية مليئة بالتعبيرات غير الموثقة، أو محاولة فهم الإجابة التي قمت بنسخها من المنتدى، كلها حالات يكون لديك فيها النمط وتحتاج إلى معرفة ما يفعله قبل أن تثق به. تصل إلى اختبار regex عندما تفهم النمط بالفعل وتريد تأكيد سلوكه مقابل الأمثلة الحقيقية. من الناحية العملية، يعمل الاثنان كزوج: اشرح نمطًا لفهمه، ثم اختبره لإثباته. يجلس المختبر والمفسر بجانب بعضهما البعض على Toolz.dev لهذا السبب بالضبط.
هناك أداة ثالثة في العائلة تستحق التسمية. ال regex builder يجمع نمطًا من المكونات والقوالب عندما تبدأ من الصفر. البناء والشرح والاختبار: تغطي هذه الثلاثة دورة الحياة الكاملة للعمل مع تعبير عادي، ومن كتابة تعبير لا يتعين عليك بعد فهم تعبير لم تكتبه.
ماذا يظهر الانهيار فعلا؟
يسير المفسر على النمط من اليسار إلى اليمين ويصدر سطرًا واحدًا محددًا لكل بنية، بالترتيب الذي يواجهه المحرك. هذا الترتيب مهم، لأن التعبير العادي يُقرأ بالتسلسل، ورؤية الرموز المميزة بالتسلسل تعكس كيفية استمرار المطابقة فعليًا.
المراسي تأتي في المرتبة الأولى في معظم الأنماط. ال ^ و $ الرموز لا تتطابق مع الأحرف؛ يؤكدون موضع السلسلة وبداية ونهايتها، أو بداية ونهاية كل سطر عند تعيين العلامة متعددة الأسطر. يلاحظ المفسر هذا السلوك المزدوج، لذلك لا تتفاجأ أبدًا بالمرساة التي تتصرف بشكل مختلف تحت m علم.
تصف فئات الأحرف، المكتوبة بين قوسين مربعين، حرفًا واحدًا مأخوذًا من مجموعة. يقوم المفسر بتوسيع المجموعة إلى كلمات: نطاقات مثل a-z تصبح "؛ النطاق من أ إلى ز، "؛ يهرب الاختزال مثل \d تصبح "؛ رقم، "؛ وتصبح علامة الإقحام الرائدة "؛ أي شخصية ليست "؛ المجموعة المدرجة. فئة كثيفة مثل [a-zA-Z0-9._%+-] يقرأ كقائمة عادية بدلا من اللغز.
محددات الكمية هي المكان الذي تعيش فيه الأخطاء الدقيقة، لذا تحصل على خطوطها الخاصة. أ * هو صفر أو أكثر، + هو واحد أو أكثر، ? هو صفر أو واحد، و {n,m} هو نطاق واضح. والأهم من ذلك، أن المفسر يشير إلى محددات الكمية البطيئة، تلك المكتوبة بعلامة زائدة ? مثل +? أو *?لأن الفرق بين الجشع والكسول يتغير النص الذي يلتقطه النمط دون تغيير حرف واحد مرئي في مكان آخر.
يتم وضع مسافة بادئة للمجموعات والمشاهدات لإظهار التداخل. تحصل كل مجموعة من مجموعات الالتقاط، والمجموعات غير الملتقطة، والمجموعات المسماة، وجميع أنواع البحث الأربعة على وصف لما تفعله، ويتم وضع مسافة بادئة للنمط الفرعي بداخلها بمستوى واحد بحيث يُقرأ الهيكل كمخطط تفصيلي متداخل بدلاً من مجموعة مسطحة من الرموز.
إليك كيفية تعيين التركيبات الشائعة لما يخبرك به المفسر
| يبني | مثال | ماذا يقول المفسر |
|---|---|---|
| مرساة | ^ |
بداية السلسلة (أو بداية سطر بالعلامة m) |
| فئة الشخصية | [a-z] |
حرف واحد من النطاق من أ إلى ز |
| الاختزال | \d |
رقم من 0 إلى 9 |
| محدد الكمية | {2,} |
كرر مرتين أو أكثر |
| الكمي كسول | +? |
كرر مرة واحدة أو أكثر، أقل عدد ممكن |
| التقاط المجموعة | (...) |
بداية مجموعة الالتقاط، المحفوظة لإعادة الاستخدام |
| المجموعة المسماة | (?<id>...) |
بداية مجموعة التقاط مسماة "؛id"؛ |
| انظر للأمام | (?=...) |
يجب أن يتبع النمط المغلق، ولكن لا يتم استهلاكه |
| مرجع خلفي | \1 |
يطابق نفس مجموعة النص 1 التي تم التقاطها |
الأوصاف تتبع المصطلحات المستخدمة في مرجع التعبيرات العادية MDN، لذا، إذا كنت تريد قراءة المزيد عن أي بناء واحد، فإن الكلمات الموجودة في التقسيم هي الكلمات التي يجب البحث عنها.
لماذا النكهة مهمة؟
التعبيرات العادية ليست لغة واحدة؛ إنهم عائلة من الأشخاص ذوي الصلة الوثيقة. JavaScript، PCRE (يستخدمه PHP والعديد من الأدوات)، Python'؛s re تشترك كل من Unitue وJava و.NET في بناء الجملة الأساسي، لكنها تتباعد عند الحواف، وهذه الحواف هي المكان الذي يتكاثر فيه الارتباك. يصف مفسر Regex تعبيرات JavaScript العادية، والنكهة التي تستخدمها المتصفحات وNode.js، لأن هذا هو ما تتحقق الأداة ضده وما يديره معظم مطوري الويب فعليًا.
النواة المشتركة كبيرة وموثوقة. فئات الشخصيات، محددات الكمية المشتركة، التناوب مع |، التجميع، والمراسي، والاختصارات القياسية مثل \d و \w يعني نفس الشيء في كل مكان. إذا كان النمط الخاص بك يستخدم هذه فقط، فإن الشرح دقيق بغض النظر عن اللغة التي ستستخدمه في النهاية. الاختلافات موجودة في الميزات المتقدمة: وصل دعم البحث الخلفي متأخرًا في JavaScript ويختلف عن PCRE، ويختلف بناء جملة المجموعة المسماة بين النكهات، وتدعم بعض المحركات التكرار أو محددات الكمية الملكية التي لا تمتلكها JavaScript على الإطلاق.
القاعدة العملية بسيطة. تعامل مع شرح البنيات المشتركة على أنه موثوق، وتحقق مرة أخرى من أي امتداد خاص بالنكهة مقابل الوثائق الخاصة بلغتك المستهدفة. نظرًا لأن المفسر يتحقق من صحة النمط باستخدام محرك JavaScript الحقيقي أولاً، فإن البنية التي لا تدعمها JavaScript ستظهر كخطأ بدلاً من تفسير خاطئ، وهو الفشل الأكثر أمانًا. إذا كنت تعمل عبر المكدس بالطريقة التي أعمل بها، فإن التنقل بين الواجهة الخلفية PHP والواجهة الأمامية لـ JavaScript، يكون واضحًا بشأن النكهة يحفظ فئة الخطأ حيث يسيء النمط الذي يعمل في مكان ما التصرف بصمت في مكان آخر.
كيف أقرأ نمطًا حقيقيًا به؟
خذ العينة التي يتم تحميلها من الأداة افتراضيًا، بنمط على شكل بريد إلكتروني: ^(?<user>[a-z0-9._%+-]+)@(?<domain>[a-z0-9.-]+\.[a-z]{2,})$ مع العلم غير الحساس لحالة الأحرف. في حد ذاته هو لذيذ. قم بتشغيله من خلال المفسر ويتحلل إلى مخطط قصير يمكن قراءته.
ال ^ يؤكد بداية السلسلة. تلتقط المجموعة المسماة الأولى، المستخدم، حرفًا واحدًا أو أكثر من فئة من الأحرف الصغيرة والأرقام وعلامات الترقيم المسموح بها عادةً في الجزء المحلي من العنوان. ثم حرفي @. المجموعة أو المجال المسمى الثاني، يلتقط حرفًا أو رقمًا أو نقاطًا أو واصلات واحدة أو أكثر، متبوعة بنقطة حرفية ومجموعة من حرفين أو أكثر، وهو مجال المستوى الأعلى. أخيراً $ يؤكد نهاية السلسلة. ال i العلامة تعني أن الأمر برمته يتطابق بغض النظر عن الحالة، وبالتالي فإن الفئات الصغيرة فقط لا تزال تقبل إدخال الأحرف الكبيرة.
اقرأ بهذه الطريقة، شيئان يقفزان غير مرئيين في النمط الخام. أولا، ال {2,} في نطاق المستوى الأعلى يعني أن النمط يقبل أي TLD مكون من حرفين أو أكثر، وهو ما ينطبق على النطاقات الحديثة ولكنه قد يرفض TLD الدولي المكتوب بأحرف غير لاتينية. ثانيًا، تعني أدوات التثبيت أن النمط يجب أن يتطابق مع السلسلة بأكملها، لذا فهو يتحقق من صحة عنوان كامل بدلاً من العثور على عنوان داخل نص أكبر. هذه هي بالضبط أنواع التفاصيل التي تحدد ما إذا كان التحقق من الصحة صارمًا جدًا أو فضفاضًا جدًا، وهي واضحة في الانهيار بينما يسهل تفويتها في النص الأصلي.
بمجرد أن تفهم نمطًا ما، غالبًا ما ترغب في القيام بشيء ما به. إذا كان نمط البحث والاستبدال، فإن استبدال ريجكس تقوم الأداة بتشغيل الاستبدال بدعم المرجع الخلفي. إذا كان نمط الاستخراج، فإن مستخرج البريد الإلكتروني يطبق نسخة منسقة من هذا النوع من مطابقة البريد الإلكتروني للنص المجمع. الشرح هو خطوة القراءة؛ هذه هي خطوات التمثيل.
متى سأستخدم هذا بالفعل؟
مراجعة التعليمات البرمجية هي الحالة التي ضربتها أكثر. يضيف أحد الزملاء تعبيرًا عاديًا إلى طبقة التحقق من الصحة أو محلل السجل، ويظهر الفرق سطرًا من الرموز بدون تعليق. يؤدي لصقه في المفسر إلى تحويل التحديق لمدة خمس دقائق إلى قراءة مدتها عشر ثوانٍ، ويلتقط أخطاء المراجعة الكلاسيكية: نقطة غير مفر منها تتطابق مع أي شخصية، ومحدد كمي جشع يلتقط الكثير، ومرساة موجودة أو غائبة عندما ينبغي أن يكون الأمر على العكس من ذلك. لقد بدأت في لصق التفاصيل في طلب السحب كتعليق، والذي يوثق النمط للشخص التالي مجانًا.
التعلم هو التالي. التعبيرات العادية هي إحدى تلك المهارات التي لا تلتصق تمامًا إلا إذا استخدمتها يوميًا، والعودة إليها بعد بضعة أشهر تعني دائمًا إعادة تعلم بناء الجملة. تعد قراءة الأنماط الحقيقية باستخدام المفسر طريقة أسرع للعودة من إعادة قراءة البرنامج التعليمي، لأنك ترى البنيات في السياق، وتقوم بعمل حقيقي، وليس كأمثلة معزولة. بمرور الوقت، تصبح الأوصاف غير ضرورية لأنك استوعبتها، وهذا هو الهدف.
يؤدي تصحيح الأخطاء إلى إغلاق الحلقة. عندما يتطابق النمط مع الشيء الخطأ، غالبًا ما يكشف التفسير السبب قبل أن تصل إلى إدخال الاختبار. محدد كمي جشع عندما يجب أن يكون كسولًا، فئة أحرف تتضمن حرفًا نسيته، مرساة مفقودة تتيح للنمط مطابقة سلسلة فرعية: كل هذه مرئية في الانهيار. أحتفظ بالشرح بجوار اختبار regex لذلك يمكنني أن أشرح وأختبر في نفس الجلسة، وكلاهما يعيش في المجموعة الأوسع التي وصفتها في دليل مجموعة أدوات مطور الويب.
هل هو خاص، وهل يعمل دون اتصال بالإنترنت؟
نعم لكليهما ولنفس السبب. يتم حساب الانهيار بالكامل في JavaScript داخل متصفحك. لا يتم إرسال النمط مطلقًا إلى الخادم، ولا يتم تسجيل أي شيء، وبمجرد تحميل الصفحة، تستمر الأداة في العمل مع تعطيل اتصالك. يمكنك تأكيد ذلك عن طريق فتح علامة تبويب الشبكة أو عن طريق عدم الاتصال بالإنترنت ومشاهدتها وهي تستمر في العمل.
وهذا يهم أكثر مما قد يبدو للتعبيرات العادية على وجه التحديد. غالبًا ما تتم كتابة الأنماط لتتناسب مع التنسيقات الحساسة: المعرفات الداخلية، أو أشكال مفاتيح واجهة برمجة التطبيقات، أو تخطيطات أرقام الحساب، أو بنية البيانات الخاصة. إن لصق أحد هذه العناصر في أداة من جانب الخادم يعني تسليم وصف لتنسيق بياناتك إلى طرف ثالث. إن الحفاظ على التحليل من جانب العميل يعني بقاء النمط على جهازك، وهو نفس مبدأ الخصوصية أولاً وراء كل أداة على Toolz.dev، وهو المبدأ الذي كتبت عنه بشكل كامل في دليل خصوصية البيانات.
أسئلة وأجوبة
كيف أفهم التعبير العادي المعقد؟
الصق النمط في الشرح واقرأ تفصيل رمز تلو الآخر، الذي يصف كل بنية باللغة الإنجليزية البسيطة بالترتيب الذي يطبقه به المحرك. يتم وضع مسافة بادئة للمجموعات المتداخلة حتى تتمكن من رؤية الهيكل. يؤدي هذا إلى تحويل محاكاة المحرك عقليًا إلى مجرد قراءة قائمة مصنفة، وهي أسرع وأقل عرضة للخطأ بكثير.
ما الفرق بين مفسر regex واختبار regex؟
يصف شرح regex ما يعنيه النمط دون أي إدخال اختبار، بينما يقوم اختبار regex بتشغيل النمط مقابل نموذج النص ويظهر ما يطابقه. استخدم المفسر لفهم أو توثيق نمط غير مألوف، ثم استخدم المُختبر للتأكد من أنه يتصرف كما هو متوقع مقابل البيانات الحقيقية. يجيبون على أسئلة مختلفة ويعملون بشكل جيد كزوج.
ما هي نكهة regex التي يصفها الشرح؟
ويصف التعبيرات العادية لـ JavaScript (ECMAScript)، والنكهة التي تستخدمها المتصفحات وNode.js. تتم مشاركة معظم بناء الجملة، بما في ذلك فئات الأحرف ومحددات الكمية والمجموعات والمثبتات، مع PCRE وPython وJava، وبالتالي فإن التفسير الأساسي دقيق عبر اللغات. يمكن أن تختلف الميزات الخاصة بالنكهة مثل بناء جملة lookbehind والمجموعة المسماة، لذا تحقق من تلك الموجودة في اللغة الهدف.
ما هو الفرق بين الجشع والكسول الكمي؟
يطابق المحدد الكمي الجشع مثل + أو * أكبر قدر ممكن من النص قبل التراجع، بينما يطابق المحدد الكمي البطيء نفس الرمز متبوعًا بـ ؟ مثل +؟ أو *؟، يتطابق بأقل قدر ممكن. يسمي المفسر محددات الكمية الكسولة بشكل صريح، لأن الاختلاف يغير النص الذي يلتقطه النمط دون تغيير أي حرف مرئي في مكان آخر.
هل يمكن للشرح التعامل مع Lookahead و LookBehind؟
نعم. نظرة إيجابية وسلبية للأمام، مكتوبة (؟=...) و(؟!...)، ونظرة إيجابية وسلبية للخلف، مكتوبة (؟<؛=...) و(؟<؛!...)، يتم تصنيف كل منها بما يؤكده ويتم وضع مسافة بادئة مثل المجموعات الأخرى. انظروا إلى أن النص يظهر أو لا يظهر في موضع دون إدراجه في المطابقة، وهو ما توضحه الأوصاف.
لماذا يقول الشرح أن نمطي غير صالح؟
يتم تجميع النمط باستخدام محرك RegExp الحقيقي قبل شرحه، لذلك يتم الإبلاغ عن قوس أو قوس غير متوازن، أو هروب غير صالح، أو علامة غير معروفة مع رسالة الخطأ الدقيقة الخاصة بالمحرك '؛. قم بإصلاح المشكلة التي تم الإبلاغ عنها، وغالبًا ما تكون قوس أو قوس إغلاق مفقودًا، وسيظهر العطل.
هل من الآمن لصق regex الذي يطابق البيانات الخاصة؟
نعم. يتم تحليل النمط بالكامل بلغة JavaScript داخل متصفحك. لا يتم إرساله مطلقًا إلى خادم، ولا يتم تسجيله مطلقًا، وتعمل الأداة مع تعطيل اتصالك بمجرد تحميل الصفحة. يمكنك شرح الأنماط بأمان من قواعد التعليمات البرمجية الخاصة أو تلك التي تطابق التنسيقات الشخصية أو الخاصة.
كيف يختلف هذا عن منشئ regex؟
يساعدك منشئ regex على إنشاء نمط جديد من المكونات والقوالب عندما تبدأ من الصفر، بينما يصف المفسر النمط الذي لديك بالفعل. الاثنان متكاملان: قم ببناء نمط باستخدام Regex Builder، وافهم نمطًا موجودًا باستخدام المفسر، وقم بتأكيد أي منهما مقابل الإدخال الحقيقي باستخدام Regex Tester.
اقرأ الأنماط الخاصة بك مجانًا شرح regex. يقوم بتقسيم التعبير العادي إلى رمز مميز تلو الآخر باللغة الإنجليزية البسيطة، بالكامل في متصفحك، دون تحميل أي شيء.



