دليل للمبتدئين حول التعبيرات العادية في 30 دقيقة

دليل للمبتدئين حول التعبيرات العادية في 30 دقيقة

هدف هذه المقالة

اجعل نفسك تفهم ما هي التعبيرات العادية في غضون 30 دقيقة، واحصل على بعض الفهم الأساسي لها، مما يمكنك من استخدامها في برامجك أو صفحات الويب الخاصة بك.

كيفية استخدام هذا الدليل

لا تدع العبارات المعقدة أدناه تخيفك، فقط اتبعني خطوة بخطوة، وستكتشف أن التعبيرات النمطية ليست بالصعوبة التي تتخيلها. بالطبع، إذا انتهيت من قراءة هذا الدليل ووجدت أنك فهمت الكثير، لكنك بالكاد تتذكر أي شيء، فهذا أمر طبيعي تمامًا - أعتقد أنه من غير المحتمل أن يتذكر شخص لم يسبق له التعامل مع التعبيرات النمطية أكثر من 80٪ من القواعد المذكورة بعد قراءة هذا الدليل. الهدف هنا هو أن تفهم المبادئ الأساسية، وستحتاج إلى المزيد من الممارسة والاستخدام في المستقبل لتتقن التعبيرات النمطية.

الأهم هو - من فضلك أعطني 30 دقيقة إذا لم يكن لديك خبرة في استخدام التعبيرات العادية، فلا تحاول في 30 ثانية الدخول الداخلي - إلا إذا كنت سوبرمان :)

بالإضافة إلى كونه دليلًا تمهيديًا، يحاول هذا المقال أيضًا أن يكون مرجعًا لقاعدة بيانات التعبيرات العادية يمكن استخدامه في العمل اليومي. بناءً على تجربة الكاتب الشخصية، تم تحقيق هذا الهدف بشكل جيد - كما ترى، لم أتمكن من تذكر كل شيء بنفسي، أليس كذلك؟

إزالة التنسيق اتفاقية تنسيق النص: المصطلحات الفنية الأحرف الخاصة / تنسيق القواعد تعبير منتظم جزء من التعبير العادي (للاستقصاء) سلسلة المصدر المطابقة لذلك شرح التعبيرات العادية أو جزء منها

التعليقات الجانبية المخفية على الجانب الأيمن من هذه المقالة توجد بعض التعليقات، تهدف بشكل أساسي إلى تقديم معلومات ذات صلة، أو لشرح بعض المفاهيم الأساسية للقراء الذين ليس لديهم خلفية برمجية، وعادة ما يمكن تجاهلها.

ما هو التعبير العادي بالضبط؟

عند كتابة برنامج أو صفحة ويب لمعالجة السلاسل النصية، غالبًا ما تكون هناك حاجة للبحث عن سلاسل نصية تت符合 بعض القواعد المعقدة. تعبير منتظم إنها أداة تستخدم لوصف هذه القواعد. بعبارة أخرى، التعبيرات العادية هي رمز لتسجيل قواعد النص.

من المحتمل أنك قد استخدمت أدوات البحث عن الملفات في نظام Windows/Dos. رمز البدل( wildcard ) أيضاً * و ? إذا كنت ترغب في البحث عن جميع مستندات Word في دليل معين، فسوف تبحث عن * .doc هنا، * يمكن تفسيره على أنه سلسلة عشوائية. مثل الرموز النمطية، فإن التعبيرات العادية هي أيضًا أداة لمطابقة النصوص، إلا أنها أكثر دقة في وصف احتياجاتك - بالطبع، الثمن هو التعقيد الأكبر - على سبيل المثال، يمكنك كتابة تعبير عادي للبحث عن جميع السلاسل التي تبدأ بـ 0، تتبعها 2-3 أرقام، ثم علامة ناقص "-"، وأخيرًا 7 أو 8 أرقام. (مثل 010-12345678 أو 0376-7654321 )。

شخصية هو الوحدة الأساسية عند معالجة النصوص بواسطة البرمجيات الحاسوبية، وقد تكون حرفًا أو رقمًا أو علامة ترقيم أو فراغًا أو حرف نقل أو حرف صيني وغيرها. سلسلة نصية هي سلسلة تتكون من 0 أو أكثر من الأحرف. نص أي نص، سلسلة. يقول سلسلة معينة مطابقة تعبير عادي معين، عادة ما يشير إلى أن هناك جزءًا (أو عدة أجزاء) من هذه السلسلة يمكن أن تلبي الشروط التي يحددها التعبير.

مدخل

أفضل طريقة لتعلم التعبيرات العادية هي البدء بالأمثلة، وبعد فهم الأمثلة، يمكنك تعديلها وتجربتها بنفسك. فيما يلي العديد من الأمثلة البسيطة مع شروح تفصيلية لها.

افترض أنك تبحث في رواية إنجليزية. hi يمكنك استخدام تعبيرات منتظمة hi

هذا هو أبسط تعبير منتظم تقريبًا، يمكنه مطابقة هذه السلاسل بدقة: يتكون من حرفين، الحرف الأول هو h، والحرف الثاني هو i. عادةً ما توفر الأدوات التي تتعامل مع التعبيرات النمطية خيارًا لتجاهل حالة الأحرف، وإذا تم تحديد هذا الخيار، يمكنها المطابقة hi , HI , Hi , hI أي من هذه الحالات الأربع.

للأسف، تحتوي العديد من الكلمات على hi هذان الحرفان المتتاليان، مثل him , history , high انتظر. استخدم hi للبحث عن الكلام، هنا في الداخل hi سوف يتم العثور عليها أيضًا. إذا كان هناك حاجة إلى ابحث بدقة عن كلمة "hi" يجب علينا استخدام \bhi\b

\b هو رمز خاص تحدده التعبيرات العادية (حسناً، يسميه بعض الناس) رمز مميز، metacharacter ) تمثل بداية أو نهاية الكلمة، أي نقطة الفصل بين الكلمات. على الرغم من أن الكلمات الإنجليزية عادةً ما تُفصل بواسطة المسافات أو علامات الترقيم أو الفقرات، إلا أن \b لا يتطابق مع أي من أحرف فصل الكلمات هذه. مطابقة موقع واحد فقط

إذا كنت تبحث عن هاي، هناك لوسي قريبة خلفي. يجب أن تستخدم \bhi\b.*\bLucy\b

إذا كنت بحاجة إلى تعبير أكثر دقة، \b مطابقة هذا الموضع: يجب أن يكون الحرف السابق له والحرف اللاحق له ليسا كاملين (واحد موجود والآخر غير موجود أو غير موجود) \w

هنا، . هو حرف مميز آخر، يتطابق مع أي حرف غير حرف السطر الجديد . * هي أيضًا حرف خاص، لكنها لا تمثل حرفًا أو موقعًا، بل الكمية - إنها تحدد * يمكن تكرار المحتوى السابق عدة مرات لجعل التعبير الكامل متطابقًا. لذلك،. * ترتبط معًا مما يعني أي عدد من الأحرف التي لا تحتوي على فواصل أسطر. الآن \bhi\b. * \bLucy\b المعنى واضح جدًا: مرحباً Lucy

إذا استخدمنا رموز خاصة أخرى في نفس الوقت، يمكننا إنشاء تعبيرات منتظمة أقوى. على سبيل المثال، المثال أدناه:

0\d\d-\d\d\d\d\d\d\d\d مطابقة مثل هذه السلاسل: بدايةً بالصفر، ثم رقمين، ثم علامة الطرح "-"، وأخيراً ثمانية أرقام. (أيضًا، هذا هو رقم الهاتف في الصين. بالطبع، هذا المثال يمكن أن يتطابق فقط مع حالة يكون فيها رمز المنطقة مكونًا من 3 أرقام).

换行符就是'\n',ASCII编码为10(十六进制 0x0A ) حرف.

هنا \d هو حرف جديد، يطابق رقم (0 أو 1 أو 2 أو ...) )- ليس حرفًا خاصًا، بل يطابق نفسه فقط - هو حرف الطرح (أو الناقص، أو الخط الأوسط، أو كما تسميه).

لتجنب كل هذه التكرارات المزعجة، يمكننا أيضًا كتابة هذا التعبير بهذه الطريقة: 0\d{2}-\d{8} هنا \d 后面的{ 的阿拉伯语翻译是:الخلفية { 2 }({ 8 ) تعني "الأمام" \d يجب مطابقة التكرار مرتين متتاليتين (8 مرات)

اختبار التعبير العادي

إذا كنت لا تجد أن تعبيرات الانتظام صعبة القراءة والكتابة، فإما أنك عبقري، أو أنك لست من كوكب الأرض. قواعد تعبيرات الانتظام محيرة للغاية، حتى بالنسبة للأشخاص الذين يستخدمونها بشكل متكرر. نظرًا لصعوبة القراءة والكتابة، وسهولة الخطأ، من الضروري العثور على أداة لاختبار تعبيرات الانتظام.

أدوات الاختبار الأخرى المتاحة:

تختلف بعض تفاصيل التعبيرات العادية في بيئات مختلفة، هذه الدورة التعليمية تتناول سلوك التعبيرات العادية تحت إطار عمل .Net Framework 4.0، لذا أوصي بالأداة التي قمت بكتابتها تحت .Net. أداة اختبار التعبيرات العادية يرجى الرجوع إلى تعليمات هذه الصفحة لتثبيت وتشغيل البرنامج.

إليك لقطة شاشة لبرنامج اختبار Regex أثناء التشغيل:

regex_tester

رمز خاص

الآن أنت تعرف عددًا من الأحرف الخاصة المفيدة، مثل \b , . , * و أيضا \d .في التعبيرات العادية، هناك المزيد من الأحرف الخاصة، مثل \s مطابقة أي فراغات عشوائية، بما في ذلك المسافات، علامات التبويب (Tab)، فواصل الأسطر، والمسافات الصينية الكاملة. \w مطابقة حرف أو رقم أو خط سفلي أو حروف صينية وغيرها

لنلقِ نظرة على المزيد من الأمثلة:

\ba\w * \b مطابقة بالحروف a كلمة البداية - تبدأ أولاً من مكان كلمة معينة \b )، ثم الحروف a ثم أي عدد من الحروف أو الأرقام ( \w * )، وأخيرًا في نهاية الكلمة( \b )。

الدعم للمعالجة الخاصة باللغة الصينية / الأحرف الصينية يتم توفيره من خلال محرك التعبيرات النمطية الخاص بـ .Net، يرجى مراجعة الوثائق ذات الصلة للحالات الأخرى.

حسناً، دعنا نتحدث عن معنى الكلمات في التعبيرات العادية: وهي عبارة عن مجموعة متتالية من \w لا تقل عن واحدة. صحيح، هذا ليس له علاقة كبيرة بتعلم اللغة الإنجليزية وحفظ الآلاف من الأشياء التي تحمل نفس الاسم :)

\d+ مطابقة رقم واحد أو أكثر من الأرقام المتتالية هنا + هو و * تشبه الرموز المميزة، لكن الاختلاف هو * مطابقة التكرار أي عدد من المرات (قد تكون 0 مرة)، بينما + إذًا تطابق كرر مرة واحدة أو أكثر

\b\w{6}\b مطابقة كلمة تتكون من 6 أحرف

رمز شرح
. مطابقة أي حرف باستثناء حرف السطر الجديد
\w مطابقة الحروف أو الأرقام أو الخطوط السفلية أو الحروف الصينية
\s مطابقة أي رموز بيضاء
\d مطابقة الأرقام
\b مطابقة بداية أو نهاية الكلمة
^ مطابقة بداية السلسلة
$ مطابقة نهاية السلسلة النصية

رمز خاص ^ و $ تتطابق جميعها في موقع واحد، وهذا مع \b نوعا ما مشابه. ^ مطابقة بداية السلسلة التي تريد استخدامها للبحث، $ مطابقة النهاية. هذه الشيفرتان مفيدتان جداً في التحقق من محتوى الإدخال، مثلما يحدث في موقع ويب يطلب منك أن يكون رقم QQ الذي تملأه مكوناً من 5 إلى 12 رقماً: ^\d{5,12}$

هنا { 5,12 } و{ الذي تم تقديمه سابقًا 2 } هو مشابه، فقط { 2 } مطابقة يمكن تكرارها مرتين بالضبط. ,{ 5,12 } هو عدد التكرارات لا يمكن أن يقل عن 5 ولا يمكن أن يزيد عن 12. إلا إذا لم تتطابق جميعها.

عادةً ما توفر محركات التعبيرات النمطية طريقة "لاختبار ما إذا كانت سلسلة معينة تتطابق مع تعبير نمطي"، مثل في JavaScript. RegExp.test() طريقة أو دالة Regex.IsMatch() في .NET. هنا تشير المطابقة إلى ما إذا كان هناك جزء من السلسلة يتوافق مع قواعد التعبير. إذا لم يتم استخدام ^ و $ بالنسبة لـ \d{5,12} لا يمكن ضمان أن تحتوي السلسلة النصية على ذلك باستخدام هذه الطريقة. الأرقام المتتالية من 5 إلى 12 وليس سلسلة كاملة تتكون من 5 إلى 12 رقمًا.

لأنني استخدمت ^ و $ لذا يجب استخدام السلسلة المدخلة بالكامل للمقارنة مع \d{5,12} للمطابقة، وهذا يعني أن الإدخال بالكامل يجب أن يكون من 5 إلى 12 رقمًا لذلك إذا كان رقم QQ المدخل يمكن أن يتطابق مع هذا التعبير النمطي، فإنه يستوفي المتطلبات.

مثل خيار تجاهل حالة الأحرف، تحتوي بعض أدوات معالجة التعبيرات النمطية أيضًا على خيار لمعالجة النصوص متعددة الأسطر. إذا تم تحديد هذا الخيار، ^ و $ أصبح المعنى هو مطابقة بداية ونهاية السطر

تحويل الأحرف الهروب

إذا كنت تريد البحث عن الرموز الخاصة نفسها، مثل البحث عن . أو *، فستواجه مشكلة: لا يمكنك تحديدها لأنها ستُفسر بمعنى آخر. في هذه الحالة، يجب عليك استخدام \ لإلغاء المعنى الخاص لهذه الرموز. لذلك، يجب عليك استخدام . و \ * بالطبع، للبحث عن \ بنفسه، يجب عليك أيضًا استخدام \ \ .

على سبيل المثال: unibetter \ .com مطابقة unibetter.com >C: \ Windows مطابقة C:\Windows

تكرار

لقد شاهدت ما سبق. * , + , {2} , {2,5} هذه هي الطرق المتكررة للمطابقة. فيما يلي جميع المحددات في التعبيرات العادية (كود يحدد الكمية، مثل *، {5،12}، إلخ):

رمز / قواعد شرح
* تكرار صفر مرة أو أكثر
+ كرر مرة أو أكثر
? تكرار صفر مرة أو مرة واحدة
{n} تكرار n مرة
{n,} تكرار n مرة أو أكثر
{m,m} كرر n إلى m مرة

إليك بعض الأمثلة على الاستخدام المتكرر:

Windows\d+ مطابقة ويندوز يتبعه رقم واحد أو أكثر

^\w+ مطابقة الكلمة الأولى في السطر (أو الكلمة الأولى في السلسلة الكاملة، يعتمد على خيارات الإعداد المحددة).

فئة الأحرف

من السهل جدًا البحث عن الأرقام أو الحروف أو الأرقام، لأن هناك بالفعل ما يقابل هذه الشخصيات. * * رمز مميز، ولكن إذا كنت ترغب في مطابقة الأحرف التي لا تحتوي على رموز مميزة محددة مسبقًا * * (مثل الحروف المتحركة a و e و i و o و u)، ماذا يجب أن نفعل؟

[很简单,你只需要在方括号里列出它们就行了,像] [aeiou] فقط التوافق أي حرف من أحرف العلة الإنجليزية [.?!] مطابقة علامات الترقيم (. أو؟ أو !)

يمكننا أيضًا بسهولة تحديد حرف واحد. النطاق مثل [0-9] معنى التمثيل و \d إنها مطابقة تمامًا: رقم واحد بالمثل [a-z0-9A-Z_] أيضًا يعادل تمامًا \w (إذا اعتبرنا اللغة الإنجليزية فقط).

إليك تعبير أكثر تعقيدًا: \ (?0\d{2}[) -]?\d{8}

يمكن أن يتطابق هذا التعبير. أنواع مختلفة من تنسيقات أرقام الهواتف مثل (010)88886666 أو 022-22334455 أو 02912345678 انتظر. دعنا نقوم ببعض التحليل لها: أولاً، إنها حرف هروب. \ (يمكن أن تظهر 0 مرة أو مرة واحدة( ? )، ثم هو واحد 0 ، يتبعها رقمين( \d{2} ) ثم ) أو - أو فراغ منها واحدة، تظهر مرة واحدة أو لا تظهر. ? )، وأخيرًا 8 أرقام ( \d{8} )。

"(" و ")" هما أيضًا رموز خاصة، ما يلي عيد المجموعات لذلك من الضروري استخدامه هنا تحويل

شروط التفرع

للأسف، التعبير السابق يمكن أن يتطابق أيضًا. 010)12345678 أو (022-87654321 هذه الصيغة "غير الصحيحة". لحل هذه المشكلة، نحتاج إلى استخدام شروط التفرع في التعبيرات العادية شروط التفرع تشير إلى وجود عدة قواعد، إذا تم استيفاء أي قاعدة من هذه القواعد، يجب اعتبارها مطابقة. الطريقة المحددة هي استخدام | للفصل بين القواعد المختلفة. هل لا تفهم؟ لا بأس، انظر إلى المثال:

0\d{2}-\d{8}|0\d{3}-\d{7} يمكن لهذا التعبير مطابقة نوعين من أرقام الهاتف مفصولة بشرطة: أحدهما هو رمز منطقة مكون من ثلاث أرقام ورقم محلي مكون من ثمانية أرقام (مثل 010-12345678) والآخر هو رمز منطقة مكون من أربع أرقام ورقم محلي مكون من سبعة أرقام (0376-2233445)

\ (0\d{2} ) [- ]?\d{8}|0\d{2}[- ]?\d{8} هذا التعبير مطابقة أرقام الهواتف التي تتكون من 3 أرقام في رمز المنطقة، حيث يمكن وضع رمز المنطقة بين قوسين أو بدونه، ويمكن أن يكون هناك فاصلة بين رمز المنطقة ورقم الهاتف المحلي إما باستخدام شرطة أو فراغ، أو بدون أي فاصلة. يمكنك محاولة استخدام الشروط المتفرعة لتوسيع هذه التعبير ليشمل رموز المنطقة المكونة من 4 أرقام أيضًا.

\ d{5}-\d{4}|\d{5} هذا التعبير يُستخدم لمطابقة الرموز البريدية الأمريكية. قواعد الرموز البريدية في الولايات المتحدة هي 5 أرقام، أو 9 أرقام مفصولة بشرطة. السبب في تقديم هذا المثال هو أنه يوضح نقطة معينة: عند استخدام شروط الفروع، يجب الانتباه لترتيب الشروط المختلفة. إذا قمت بتغييرها إلى \ d{5}|\d{5}-\d{4} هذا سيؤدي فقط إلى مطابقة الرموز البريدية المكونة من 5 أرقام (وكذلك أول 5 أرقام من الرموز البريدية المكونة من 9 أرقام). السبب هو أنه عند اختبار شروط التفرع، سيتم اختبار كل شرط من اليسار إلى اليمين، وإذا تم استيفاء شرط معين، فلن يتم النظر في الشروط الأخرى.

التقسيم

لقد ذكرنا كيفية تكرار حرف فردي (فقط أضف المحدد بعد الحرف)؛ لكن ماذا لو كنت تريد تكرار عدة أحرف؟ يمكنك استخدام الأقواس الصغيرة لتحديد ذلك. التعبير الفرعي (يسمى أيضًا التقسيم )، ثم يمكنك تحديد عدد تكرارات هذا التعبير الفرعي، ويمكنك أيضًا إجراء بعض العمليات الأخرى على التعبير الفرعي (سيتم تقديم المزيد لاحقًا).

(\d{1,3} . ){3}\d{1,3} هو بسيط. IP مطابقة العنوان التعبير. لفهم هذا التعبير، يرجى تحليله بالترتيب التالي: \d{1,3} مطابقة الأرقام من 1 إلى 3位 (\d{1,3} \ .){3} مطابقة ثلاثة أرقام مع نقطة إنجليزية (هذا الكل هو هذا) التقسيم )تكرار 3 مرات وأخيرًا، أضف إلى ذلك رقم يتكون من واحد إلى ثلاثة أرقام \ d{1,3} )

للأسف، سيتطابق أيضًا. 256.300.888.999 هذا عنوان IP الذي لا يمكن أن يوجد. إذا كان بالإمكان استخدام المقارنات الرياضية، فقد يكون من السهل حل هذه المشكلة، لكن التعبيرات العادية لا توفر أي وظائف رياضية، لذلك يجب استخدام المجموعات الطويلة، والاختيارات، وفئات الأحرف لوصف عنوان صحيح. IP العنوان: ((2[0-4]\d|25[0-5]|[01]?\d\d?) \ .){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

لا يمكن أن يكون أي رقم في عنوان IP أكبر من 255، فلا تنخدعوا بكتّاب الموسم الثالث من "24"...

فهم هذا التعبير يعتمد على فهم 2[0-4]\d|25[0-5]|[01]?\d\d? لن أشرح ذلك بالتفصيل هنا، يجب أن تكون قادرًا على تحليل معناه بنفسك.

عكس

في بعض الأحيان، تحتاج إلى البحث عن أحرف لا تنتمي إلى فئة معينة من الأحرف التي يمكن تعريفها ببساطة. على سبيل المثال، إذا كنت تريد البحث عن أي حرف باستثناء الأرقام، ففي هذه الحالة تحتاج إلى استخدام عكس

رمز / قواعد شرح
\W مطابقة أي حرف ليس حرفًا أو رقمًا أو خطًا سفليًا أو حرفًا صينيًا
\S مطابقة أي حرف ليس مسافة فارغة
\D مطابقة أي حرف غير رقمي
\B مطابقة ليست في بداية أو نهاية الكلمة
[^x] مطابقة أي حرف بخلاف x
[^aeiou] مطابقة أي حرف باستثناء الحروف a و e و i و o و u

مثال: \S+ مطابقة السلاسل التي لا تحتوي على فراغات.

<a[^> ] +> مطابقة السلاسل التي تبدأ بحرف a والمحيطة بأقواس زاوية.

الاستشهاد العكسي

استخدم الأقواس الصغيرة لتحديد تعبير فرعي، بعد ذلك، مطابقة نص هذا التعبير الفرعي (أي المحتوى الذي تم التقاطه بواسطة هذه المجموعة) يمكن معالجته بشكل إضافي في التعبيرات أو البرامج الأخرى. بشكل افتراضي، تمتلك كل مجموعة تلقائيًا一个 رقم المجموعة القاعدة هي: من اليسار إلى اليمين، مع استخدام القوس الأيسر للمجموعة كعلامة، فإن أول مجموعة تظهر تحمل الرقم 1، والثانية تحمل الرقم 2، وهكذا.

الاستشهاد العكسي يستخدم للبحث المتكرر عن نص يطابق مجموعة معينة من النصوص السابقة. على سبيل المثال، \1 يمثل النص المطابق للمجموعة 1 صعب الفهم؟ يرجى مراجعة المثال:

\b(\w+)\b\s+\1\b يمكن استخدامها لمطابقة الكلمات المتكررة، مثل go go أو kitty kitty هذا التعبير هو أولاً كلمة واحدة أيضاً حروف أو أرقام متعددة بين بداية ونهاية الكلمة (\b(\w+)\b) ستتم التقاط هذه الكلمة في المجموعة رقم 1، ثم هي واحد أو عدة فراغات ( \s+ )، وأخيرًا هو المحتوى الملتقط في المجموعة 1 (أي الكلمة المتطابقة السابقة) \1 )

أمم... في الحقيقة، توزيع أرقام المجموعات ليس بهذه البساطة كما قلت للتو:

  • المجموعة 0 تتوافق مع التعبير العادي بالكامل.
  • في الواقع، يجب أن تتم عملية تخصيص أرقام المجموعات عن طريق مسح من اليسار إلى اليمين مرتين: المرة الأولى تُخصص فقط للمجموعات غير المسماة، والمرة الثانية تُخصص فقط للمجموعات المسماة - وبالتالي فإن جميع أرقام المجموعات المسماة أكبر من أرقام المجموعات غير المسماة.
  • يمكنك استخدام صيغة مثل (?:exp) لإلغاء حق مجموعة في تخصيص رقم المجموعة.

يمكنك أيضًا تحديد التعبيرات الفرعية بنفسك. اسم المجموعة لتحديد اسم مجموعة تعبير فرعي، يرجى استخدام الصيغة التالية: ( ? < Word>\w+ )(或者把尖括号换成'也行:( ?'Word'\w+ )، هكذا يصبح \w+ اسم المجموعة محدد为 Word للاستشهاد عكسيًا بهذه المجموعة التقاط المحتوى، يمكنك استخدام \k < Word> لذا يمكن كتابة المثال السابق على النحو التالي: \b(? < Word>\w+)\b\s+\k < Word>\b

عند استخدام الأقواس الصغيرة، هناك العديد من القواعد النحوية ذات الاستخدامات المحددة. فيما يلي بعض من أكثرها شيوعًا:

لقد ناقشنا نوعي القواعد الأولين. النوع الثالث ( ?:exp لن يغير طريقة معالجة التعبيرات العادية، ولكن محتوى المطابقة في هذه المجموعات لن يتم التقاطه في مجموعة مثل الطريقتين السابقتين، ولن يمتلك رقم مجموعة. "لماذا قد أرغب في القيام بذلك؟" - سؤال جيد، ماذا تعتقد؟

التحقق من العرض الصفري

الأربعة التالية تُستخدم للبحث عن شيء ما قبل أو بعد بعض المحتويات (ولكن لا تشمل هذه المحتويات) ، بمعنى أنها تشبه \b , ^ , $ تستخدم لتحديد موقع يجب أن يفي بشروط معينة (أي التأكيدات)، وبالتالي يُطلق عليها أيضًا التحقق من العرض الصفري من الأفضل استخدام أمثلة للتوضيح:

(?=exp) أيضاً يُسمى تأكيد التوقع الإيجابي ذو العرض الصفري ، هو يمكن أن تتطابق تعبير exp بعد الموقع الذي يظهر فيه التأكيد الذاتي. مثل \b\w+(?=ing\b) ، تطابق مع ing جزء ما قبل الكلمة الأخيرة (باستثناء ing ما بعد ذلك) مثل البحث I'm singing while you're dancing. عندما يتطابق sing و danc

(?<=exp) أيضاً يُسمى إصدار تأكيد بعد مراجعة إيجابية بدون عرض. ، هو يؤكد أن الموقع الذي يظهر فيه الذات يمكن أن يتطابق مع التعبير exp. على سبيل المثال( ?<=\bre)\w+\b سيتطابق مع كلمة تبدأ بـ "re" (باستثناء الجزء "re" فقط) على سبيل المثال، عند البحث reading a book عندما يتطابق ading

أهل الأرض، ألا تعتقد أن هذه المصطلحات معقدة جدًا وصعبة التذكر؟ أشعر بنفس الشيء. يكفي أن تعرف أن هناك شيئًا من هذا القبيل، وما اسمه، فليكن! إذا كان الشخص بلا اسم، يمكنه التركيز على ممارسة السيف؛ وإذا كان الشيء بلا اسم، يمكنه أن يُختار أو يُترك كما يشاء...

التحقق يُستخدم للإعلان عن حقيقة ينبغي أن تكون صحيحة. في التعبيرات العادية، يتم الاستمرار في المطابقة فقط عندما تكون حالة التحقق صحيحة.

إذا كنت ترغب في إضافة فاصلة بعد كل ثلاث أرقام في رقم طويل (بالطبع من الجهة اليمنى)، يمكنك البحث عن الأجزاء التي تحتاج إلى إضافة الفواصل في المقدمة والداخل. ((?<=\d)\d{3})+\b استخدمه ضد 1234567890 نتيجة البحث هي 234567890

العبارة التالية تستخدم كلا النوعين من التأكيدات: (?<=\s)\d+(?=\s) مطابقة أرقام مفصولة بمسافات فارغة (مرة أخرى نؤكد، لا تشمل هذه المسافات الفارغة)

ادعاء صفر عرض سلبي

لقد ذكرنا سابقًا كيفية البحث. ليس حرفًا معينًا أو ليس ضمن فئة معينة من الأحرف. طريقة الحروف (العكس). لكن إذا كنا نريد فقط تأكد من عدم ظهور حرف معين، ولكن لا ترغب في مطابقته. ماذا نفعل في هذه الحالة؟ على سبيل المثال، إذا أردنا البحث عن كلمات تحتوي على الحرف q، لكن الحرف الذي يلي q ليس الحرف u، يمكننا تجربة ما يلي:

\b\w * q [ ^u ] \w * \b مطابقة يتضمن الحرف q هو الحرف الذي يلي الحرف u. الكلمة لكن إذا قمت بإجراء المزيد من الاختبارات (أو إذا كانت أفكارك حادة بما يكفي لتلاحظ ذلك مباشرة)، ستكتشف أنه إذا ظهرت حرف "q" في نهاية الكلمة، مثل Iraq , Benq ، ستظهر خطأ في هذه العبارة. السبب هو [^u] يجب أن يتطابق حرف واحد على الأقل، لذلك إذا كان q هو آخر حرف في الكلمة، فإن الحروف التالية... [ ^u] سوف يتطابق مع فاصل الكلمات بعد q (قد يكون مسافة أو نقطة أو شيء آخر) ، بعد ذلك \w * \b سيتم مطابقة الكلمة التالية، لذا \b\w * q [ ^u]\w * \b يمكن أن يتطابق بالكامل Iraq fighting ادعاء صفر عرض سلبي يمكن حل هذه المشكلة لأنها تتطابق فقط مع موضع واحد، وليست كذلك. استهلاك أي حرف. الآن، يمكننا حل هذه المشكلة بهذه الطريقة: \b\w * q(?!u)\w * \b

التأكيد السلبي السابق غير المحدد العرض (?!exp) يؤكد أن الجزء الخلفي من هذا الموقع لا يمكنه مطابقة التعبير exp. على سبيل المثال: \d{3}(?!\d) مطابقة ثلاثة أرقام، وهذا لا يمكن أن تتبع الأرقام الثلاثة أرقام أخرى. \b((?!abc)\w)+\b مطابقة لا تحتوي على سلاسل متتالية abc الكلمة

بنفس الطريقة، يمكننا استخدام (?<!exp) , إصدار بيان بعد مراجعة سلبية بدون عرض واسع تعال تأكيد أن الجزء الأمامي من هذا الموضع لا يمكنه مطابقة التعبير exp (?<![a-z])\d{7} مطابقة سبعة أرقام ليست بحروف صغيرة

مثال أكثر تعقيدًا: (?<=<(\w+)>). * (?=<\/\1>) مطابقة المحتوى داخل علامات HTML البسيطة التي لا تحتوي على سمات (?<=<(\w+)>) تم تحديد ذلك بادئة الكلمات المحاطة بأقواس尖 (على سبيل المثال قد يكون) < b>),然后是 .* (أي سلسلة نصية)، وآخرها هو واحد لاحقة (?=<\/\1>) . انتبه إلى اللاحقة في النهاية \/ يستخدم الهروب من الأحرف المذكورة سابقًا؛ \1 إنه اقتباس عكسي، حيث يتم الاقتباس من المجموعة الأولى الملتقطة الأمام (\w+) المحتوى المطابق، لذا إذا كان البادئة في الواقع هي < b>的话,后缀就是 < /b>了。整个表达式匹配的是 < b>和 < /b>之间的内容(再次提醒,不包括前缀和后缀本身)。

يرجى تحليل التعبير بالتفصيل. (?<=<(\w+)>). * (?=<\/\1>) هذه العبارة تعبر بشكل أفضل عن الاستخدام الحقيقي للتأكيدات ذات العرض الصفري.

تعليق

الاستخدام الآخر للأقواس الصغيرة هو من خلال القواعد. (?#comment) تضمين التعليقات. على سبيل المثال: 2[0-4]\d(?#200-249)|25 [ 0-5](?#250-255)|[01]?\d\d?(?#0-199)

من الأفضل تفعيل خيار "تجاهل الفراغات في وضع التجاهل" إذا كنت تريد تضمين التعليقات، حتى تتمكن من إضافة الفراغات وTab والأسطر الجديدة بحرية عند كتابة التعبيرات، بينما سيتم تجاهل كل هذه العناصر أثناء الاستخدام الفعلي. بعد تفعيل هذا الخيار، سيتم اعتبار كل النص الموجود بعد # حتى نهاية السطر تعليقا وسيتم تجاهله. على سبيل المثال، يمكننا كتابة تعبير سابق بهذه الطريقة:

(?<= # تأكيد بادئة النص المراد مطابقته
<(\w+)> # البحث عن الأحرف أو الأرقام المحاطة بأقواس زاوية (أي علامات HTML/XML)
) # نهاية البادئة
.* # مطابقة أي نص
(?= # تأكيد لاحقة النص الذي يجب مطابقته
<\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # نهاية اللاحقة

الجشع والكسل

عندما تحتوي تعبيرات الانتظام على محددات تقبل التكرار، فإن السلوك المعتاد هو (شريطة أن يكون التعبير بأكمله قابلاً للمطابقة) المطابقة. بقدر الإمكان عبارة. على سبيل المثال: a. * b سيتطابق أطول سلسلة تبدأ بحرف الألف وتنتهي بحرف الباء إذا تم استخدامه للبحث aabab سوف يتطابق مع السلسلة الكاملة. aabab هذا يسمى طمع مطابقة.

أحيانًا، نحن بحاجة أكثر إلى كسل مطابقة، يعني المطابقة قدر الإمكان أقل يمكن تحويل المحددات المقدمة سابقًا إلى نمط مطابقة كسول، فقط بإضافة علامة استفهام بعده. ? هكذا .*? هذا يعني مطابقة أي عدد من التكرارات، ولكن مع استخدام أقل عدد ممكن من التكرارات شرط أن يؤدي ذلك إلى نجاح المطابقة الكاملة. الآن دعنا نلقي نظرة على مثال النسخة الكسولة:

a. * ?b مطابقة أقصر سلسلة تبدأ بحرف a وتنتهي بحرف b إذا تم تطبيقه على aabab ستتناسب. aab (الحرف الأول إلى الثالث) و أب

رمز / قواعد شرح
*? كرر عدة مرات، لكن حاول تقليل التكرار قدر الإمكان.
+? كرر مرة واحدة أو أكثر، ولكن بأقل قدر ممكن من التكرار.
?? تكرار 0 مرة أو مرة واحدة، ولكن مع أقل تكرار ممكن.
{n,m}? كرر من n إلى m مرات، ولكن بأقل تكرار ممكن.
{n,}? كرر n مرة فأكثر، ولكن بأقل تكرار ممكن.

لماذا المطابقة الأولى هي aab (من الحرف الأول إلى الثالث) وليس ab (من الحرف الثاني إلى الثالث)؟ بعبارة بسيطة، لأن التعبير العادي لديه قاعدة أخرى ذات أولوية أعلى من قاعدة الكسل/الجشع: المطابقة التي تبدأ في وقت مبكر هي التي تفوز - المطابقة التي تبدأ في وقت مبكر تفوز.

خيارات المعالجة

تم تقديم عدة خيارات أعلاه مثل تجاهل حالة الأحرف ومعالجة الأسطر المتعددة، وهذه الخيارات يمكن استخدامها لتغيير طريقة معالجة التعبيرات النمطية. فيما يلي خيارات التعبيرات النمطية الشائعة في .Net:

اسم شرح
IgnoreCase (تجاهل حالة الأحرف) المطابقة غير حساسة لحالة الأحرف
Multiline (وضع متعدد الأسطر) تغيير ^ و $ معناها، بحيث تتطابق في بداية ونهاية كل سطر على حدة، وليس فقط في بداية ونهاية السلسلة بأكملها. (في هذا النمط، $ المعنى الدقيق هو: المطابقة\nالموقع السابق وموقع نهاية السلسلة.)
Singleline (وضع السطر الواحد) تغيير معنى النقطة بحيث تتطابق مع كل حرف (بما في ذلك أحرف السطر الجديد \n)
IgnorePatternWhitespace (تجاهل الفراغات) تجاهل الفراغات غير الهاربة في التعبير وفعّل بواسطة # تعليقات العلامات
ExplicitCapture (التقاط الصريح) التقاط فقط المجموعات التي تم تسميتها بشكل صريح

سؤال يُطرح كثيرًا هو: هل يمكن استخدام نمط الأسطر المتعددة ونمط السطر الواحد في نفس الوقت؟ الجواب هو: لا. لا توجد أي علاقة بين الخيارين، باستثناء أن أسمائهما متشابهة إلى حد قد يُسبب الارتباك.

في C#، يمكنك استخدام بناء Regex(String, RegexOptions) 来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);

التوازن بين المجموعات / المطابقة المتكررة

أحيانًا نحتاج إلى مطابقة مثل ( 100 * ( 50 + 15 ) ) هيكل هرمي قابل للتداخل مثل هذا، في هذه الحالة، استخدم ببساطة \ (.+ \ ) فإنه سيتطابق فقط مع المحتوى بين أقصى يسار القوس الأيسر وأقصى يمين القوس الأيمن (هنا نحن نتحدث عن وضع الجشع، وهناك أيضًا مشكلة أدناه في وضع الكسل). إذا كان عدد الأقواس اليسرى واليمينية في السلسلة الأصلية غير متساوي، مثل ( 5 / ( 3 + 2 ) ) ) هل هناك طريقة لمطابقة المحتوى بين الأقواس المتطابقة الأطول في مثل هذه السلاسل النصية، حيث لن يتساوى عدد العناصر في النتيجة المطابقة بين الاثنين؟

التركيب النحوي المتوازن المقدم هنا مدعوم من قبل .Net Framework؛ اللغات / المكتبات الأخرى قد لا تدعم هذه الميزة، أو تدعم هذه الميزة ولكن تتطلب استخدام تركيب مختلف.

لتجنب ( و \ ( دع عقلك يتلخبط تمامًا، دعنا نستخدم الأقواس الزاوية بدلاً من الأقواس الدائرية. الآن أصبحت مشكلتنا هي كيفية أن نضع xx aa> yy كيف يمكن التقاط المحتوى داخل أطول زوج من الأقواس الزاوية في مثل هذه السلسلة؟

هنا يحتاج إلى استخدام التركيب النحوي التالي:

  • (?'group') قم بتسمية المحتوى الملتقط بـ "group" ثم ادفعه. المكدس (Stack)

  • (?'-group') قم بإخراج محتوى المجموعة المسماة "group" الذي تم ضغطه أخيرًا على المكدس، إذا كان المكدس فارغًا في الأصل، فإن مطابقة هذه المجموعة تفشل.

  • (?(group)yes|no) إذا كان هناك محتوى مُلتقط يُسمى group على المكدس، فتابع مطابقة الجزء yes من التعبير، وإلا فتابع مطابقة الجزء no.

  • (?!) التأكيد السلبي ذو العرض الصفري، نظرًا لعدم وجود تعبير لاحق، فإن محاولة المطابقة دائمًا ما تفشل.

    我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。

如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。

أحد الاستخدامات الأكثر شيوعًا لمجموعة التوازن هو مطابقة HTML، المثال أدناه يمكنه مطابقة العناصر المتداخلة. < div>标签: <div [ ^>] * > [ ^<>]*(((?'Open'] * >) [ ^<>] * )+((?'-Open') [ ^<>] * )+) * (?(Open)(?!)) < /div>

ما هي الأشياء الأخرى التي لم يتم ذكرها؟

لقد تم وصف العديد من العناصر لبناء التعبيرات العادية أعلاه، ولكن لا يزال هناك الكثير من الأشياء التي لم يتم ذكرها. فيما يلي قائمة ببعض العناصر التي لم يتم الإشارة إليها، مع بعض القواعد والتفسيرات البسيطة. يمكنك العثور على مراجع أكثر تفصيلاً على الإنترنت لتتعلم عنها عندما تحتاج إليها. إذا كنت قد قمت بتثبيت مكتبة MSDN، يمكنك أيضًا العثور على وثائق مفصلة حول التعبيرات العادية في .net هناك.

رمز / قواعد شرح
\a إشارة الإنذار (عند طباعتها، تصدر الكمبيوتر صوت صفارة)
\b عادةً ما تكون مواقع حدود الكلمات، ولكن إذا تم استخدامه داخل فئة الأحرف، فيمثل الرجوع للخلف.
\t تبويب
\r إدخال
\v علامة التبويب العمودية
\f فاصل صفحة
\n فاصل الأسطر
\e Escape
\0nn الحرف الذي يرمز له الرمز الثماني nn في كود ASCII
\xnn الحرف ذو الكود السداسي عشر nn في كود ASCII
\unnnn الحرف الذي يرمز له بالرمز السداسي عشر nnnn في شفرة يونيكود
\cN أحرف التحكم ASCII. مثل \cC تعني Ctrl+C
\A بداية السلسلة (مشابهة لـ ^، ولكن غير متأثرة بخيار معالجة الأسطر المتعددة)
\Z نهاية السلسلة أو نهاية السطر (غير متأثر بخيار معالجة الأسطر المتعددة)
\z نهاية السلسلة (تشبه $، ولكنها غير متأثرة بخيار معالجة الأسطر المتعددة)
\G بداية البحث الحالي
\p{name} في Unicode، تُسمى فئة الأحرف "name" مثل \p{IsGreek}.
(?>exp) عبارة الجشع
(? < x> - < y>exp) مجموعة متوازنة
(?im-nsx:exp) تغيير خيارات المعالجة في التعبير الفرعي exp
(?im-nsx) تغيير خيارات المعالجة للجزء الذي يلي التعبير
(?(exp)yes|no) اجعل exp بمثابة تأكيد إيجابي مسبق ذو عرض صفري، إذا كان بالإمكان المطابقة في هذا الموضع، استخدم yes كتعبيير لهذه المجموعة؛ وإلا استخدم no.
(?(exp)yes) نفس الشيء، فقط استخدم تعبيرات فارغة كـ لا
(?(name)yes|no) إذا تم التقاط محتوى بواسطة المجموعة المسماة name، استخدم yes كتعبيير؛ وإلا استخدم no.
(?(name)yes) نفس الشيء، فقط استخدم تعبيرات فارغة كـ لا

الاتصال بالكاتب

好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?

إذا كنت ترغب في تقديم شكوى ضدي، أو تعتقد أنني يمكنني خداعك بطريقة أفضل، أو لديك أي مشكلات أخرى، فلا تتردد في القدوم. مدونتي دعني أعرف.

الموارد المتاحة على الإنترنت والمراجع المذكورة في هذه المقالة

لقد استخدمت مؤخرًا:

جمع قائمة الطعام QQ