التعبير النمطي

تُظهر التظليلات الزرقاء  نتائج مطابقة نمط التعبير النمطي:(حرف r صغير متبوعًا بحرف علة صغير واحد أو أكثر)./r[aeiou]+/g

التعبير النمطي (يُختصر إلى regex أو regexp[ 1 ] ويُشار إليه أحيانًا بالتعبير المنطقي ، [ 2 ] [ 3 ] هو سلسلة من الأحرف تُحدد نمط مطابقة في النص . عادةً ما تُستخدم هذه الأنماط بواسطة خوارزميات البحث عن السلاسل النصية لعمليات "البحث" أو "البحث والاستبدال" ، أو للتحقق من صحة المدخلات . وقد طُوّرت تقنيات التعبير النمطي في علوم الحاسوب النظرية ونظرية اللغات الرسمية .

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

تُستخدم التعابير النمطية في محركات البحث ، وفي مربعات حوار البحث والاستبدال في معالجات النصوص ومحرراتها ، وفي أدوات معالجة النصوص مثل sed و AWK ، وفي التحليل المعجمي . وتدعم العديد من لغات البرمجة التعابير النمطية. وغالبًا ما تُسمى تطبيقات المكتبات " محركًا " [ 4 ] [ 5 ] ، والعديد منها متاح لإعادة الاستخدام.

تاريخ

ستيفن كول كلين ، الذي طرح هذا المفهوم

ظهرت التعابير النمطية عام 1951، عندما وصف عالم الرياضيات ستيفن كول كلين اللغات المنتظمة باستخدام ترميزه الرياضي المسمى بالأحداث المنتظمة . [ 6 ] [ 7 ] وقد نشأت هذه التعابير في علوم الحاسوب النظرية ، في فروع نظرية الأوتوماتا (نماذج الحوسبة) ووصف وتصنيف اللغات الرسمية ، مدفوعةً بمحاولة كلين وصف الشبكات العصبية الاصطناعية المبكرة . (قدّم كلين التعابير النمطية كبديل لمصطلح "المفهوم" الذي ابتكره ماكولوتش وبيتس ، لكنه أقرّ قائلاً: "نرحب بأي اقتراحات لمصطلح أكثر وصفًا". [ 8 ] ) ومن بين التطبيقات المبكرة الأخرى لمطابقة الأنماط لغة SNOBOL ، التي لم تستخدم التعابير النمطية، بل استخدمت بدلاً منها بنيات مطابقة الأنماط الخاصة بها.

بدأ استخدام التعابير النمطية على نطاق واسع منذ عام 1968 في مجالين رئيسيين: مطابقة الأنماط في محررات النصوص [ 9 ] والتحليل المعجمي في المترجمات [ 10 ] . ومن أوائل استخدامات التعابير النمطية في البرامج، قيام كين تومسون بتضمين ترميز كلين في محرر QED كوسيلة لمطابقة الأنماط في ملفات النصوص [ 9 ] [ 11 ] [ 12 ] [ 13 ] . ولتحقيق السرعة، قام تومسون بتطبيق مطابقة التعابير النمطية باستخدام الترجمة الفورية (JIT) على كود IBM 7094 في نظام المشاركة الزمنية المتوافق ، وهو مثال مبكر هام على الترجمة الفورية [ 14 ] . ثم أضاف هذه الميزة لاحقًا إلى محرر يونكس ed ، مما أدى في النهاية إلى استخدام أداة البحث الشهيرة grep للتعابير النمطية ("grep" كلمة مشتقة من أمر البحث عن التعابير النمطية في محرر ed، وتعني "بحث شامل عن التعابير النمطية وطباعة الأسطر المطابقة"). [ 15 ] في نفس الفترة التي طور فيها تومسون برنامج QED، قام فريق من الباحثين، من بينهم دوغلاس تي. روس، بتنفيذ أداة تعتمد على التعابير النمطية تُستخدم للتحليل المعجمي في تصميم المترجمات . [ 10 ]g/re/p

استُخدمت العديد من الصيغ المختلفة لهذه الأشكال الأصلية من التعابير النمطية في برامج يونكس [ 13 ] في مختبرات بيل خلال سبعينيات القرن الماضي، بما في ذلك lex و sed و AWK و expr ، وفي برامج أخرى مثل vi و Emacs (الذي يتميز ببنية وسلوك خاصين به غير متوافقين). لاحقًا، اعتُمدت التعابير النمطية في نطاق واسع من البرامج، ووُحِّدت هذه الصيغ المبكرة في معيار POSIX.2 عام 1992.

في ثمانينيات القرن العشرين، ظهرت التعابير النمطية الأكثر تعقيدًا في لغة بيرل ، والتي اشتُقت في الأصل من مكتبة تعابير نمطية كتبها هنري سبنسر (1986)، الذي كتب لاحقًا تطبيقًا لها في لغة Tcl يُسمى Advanced Regular Expressions . [ 16 ] مكتبة Tcl هي تطبيق هجين يجمع بين NFA و DFA ، ويتميز بأداء مُحسّن. من بين مشاريع البرمجيات التي اعتمدت تطبيق سبنسر للتعابير النمطية في Tcl، نذكر PostgreSQL . [ 17 ] لاحقًا، توسعت بيرل في مكتبة سبنسر الأصلية لإضافة العديد من الميزات الجديدة. [ 18 ] يهدف جزء من تصميم Raku (المعروفة سابقًا باسم Perl 6) إلى تحسين تكامل التعابير النمطية في بيرل، وزيادة نطاقها وقدراتها للسماح بتعريف قواعد تحليل التعابير . [ 19 ] والنتيجة هي لغة مصغرة تُسمى قواعد Raku ، تُستخدم لتعريف قواعد Raku، بالإضافة إلى توفير أداة للمبرمجين في هذه اللغة. تحافظ هذه القواعد على الميزات الحالية لتعبيرات Perl 5.x النمطية، ولكنها تسمح أيضًا بتعريف محلل تنازلي متكرر على نمط BNF عبر القواعد الفرعية.

بدأ استخدام التعابير النمطية في معايير المعلومات المهيكلة لنمذجة المستندات وقواعد البيانات في ستينيات القرن الماضي، وتوسع نطاقه في ثمانينياته مع ترسيخ معايير صناعية مثل ISO SGML (التي سبقتها ANSI "GCA 101-1983"). وتُشكل التعابير النمطية جوهر معايير لغة تحديد البنية ، ويتضح استخدامها في صيغة مجموعات عناصر DTD . قبل استخدام التعابير النمطية، كانت العديد من لغات البحث تسمح باستخدام أحرف البدل البسيطة، مثل "*" لمطابقة أي تسلسل من الأحرف، و"؟" لمطابقة حرف واحد. ولا تزال آثار ذلك موجودة حتى اليوم في صيغة glob لأسماء الملفات، وفي عامل SQLLIKE .

بدأ فيليب هازل في عام 1997 بتطوير PCRE (التعبيرات النمطية المتوافقة مع بيرل)، والتي تحاول محاكاة وظائف التعبيرات النمطية في بيرل بشكل وثيق، وتستخدمها العديد من الأدوات الحديثة بما في ذلك PHP وخادم Apache HTTP . [ 20 ]

اليوم، تحظى التعابير النمطية بدعم واسع في لغات البرمجة، وبرامج معالجة النصوص (وخاصة المحللات المعجمية)، ومحررات النصوص المتقدمة، وبعض البرامج الأخرى. يُعد دعم التعابير النمطية جزءًا من المكتبة القياسية للعديد من لغات البرمجة، بما في ذلك جافا وبايثون ، وهو مُدمج في بنية لغات أخرى، مثل بيرل وإي سي إم إيه سكريبت . في أواخر العقد الثاني من الألفية، بدأت عدة شركات في تقديم تطبيقات للأجهزة، ووحدات FPGA ، [ 21 ] ووحدات معالجة الرسومات [ 22 ] لمحركات التعابير النمطية المتوافقة مع PCRE، والتي تتميز بسرعتها مقارنةً بتطبيقات وحدة المعالجة المركزية .

أنماط

يُستخدم مصطلح " التعابير النمطية " ( regex ) غالبًا للإشارة إلى الصيغة النصية القياسية والمحددة لتمثيل أنماط مطابقة النصوص، وذلك تمييزًا لها عن الصيغة الرياضية الموضحة أدناه. كل حرف في التعبير النمطي (أي كل حرف في السلسلة التي تصف نمطه) إما أن يكون حرفًا خاصًا (metacharacter ) له معنى خاص، أو حرفًا عاديًا له معنى حرفي. على سبيل المثال، في التعبير النمطي b.'b'، يُعد الحرف 'b' حرفًا عاديًا يُطابق الحرف 'b' فقط، بينما يُعد الحرف '.' حرفًا خاصًا يُطابق جميع الأحرف باستثناء سطر جديد. لذلك، يُطابق هذا التعبير النمطي، على سبيل المثال، 'b%' أو 'bx' أو 'b5'. يُمكن استخدام الأحرف الخاصة والأحرف العادية معًا لتحديد نص ذي نمط معين أو لمعالجة عدد من حالاته. قد تتفاوت مطابقة الأنماط من التطابق التام إلى التشابه العام، وذلك وفقًا للأحرف الخاصة. على سبيل المثال، .يُعدّ النمط العام [a-z](يطابق جميع الأحرف الصغيرة من 'a' إلى 'z') نمطًا أقل عمومية ونمطًا bدقيقًا (يطابق الحرف 'b' فقط). صُممت صيغة الأحرف الخاصة خصيصًا لتمثيل الأهداف المحددة بطريقة موجزة ومرنة لتوجيه أتمتة معالجة النصوص لمجموعة متنوعة من بيانات الإدخال، بشكل يسهل كتابته باستخدام لوحة مفاتيح ASCII القياسية .

من أبسط الأمثلة على استخدام التعبيرات النمطية في هذا السياق تحديد كلمة مكتوبة بطريقتين مختلفتين في محرر النصوصseriali[sz]e ؛ على سبيل المثال، يطابق التعبير النمطي كلاً من "serialise" و"serialize". ويمكن استخدام الأحرف البديلة لهذا الغرض أيضاً، ولكنها محدودة في أنماطها، نظراً لقلة الأحرف الخاصة بها وبساطة أساسها اللغوي.

يُستخدم عادةً رمز البدل في مطابقة أسماء الملفات المتشابهة، بينما تُستخدم التعابير النمطية (regex) في التطبيقات التي تُطابق أنماط النصوص بشكل عام. على سبيل المثال، يُطابق التعبير النمطي المسافات البيضاء الزائدة في بداية أو نهاية السطر. ومن التعابير النمطية المتقدمة التي تُطابق أي رقم: .^[ \t]+|[ \t]+$[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?

ترجمة نجمة كلين ( s * تعني "صفر أو أكثر من s ").

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

المفاهيم الأساسية

يُحدد التعبير النمطي، الذي يُسمى غالبًا بالنمط ، مجموعة من السلاسل النصية المطلوبة لغرض معين. إحدى الطرق البسيطة لتحديد مجموعة محدودة من السلاسل النصية هي سرد ​​عناصرها . مع ذلك، توجد طرق أكثر إيجازًا: على سبيل المثال، يمكن تحديد المجموعة التي تحتوي على السلاسل النصية الثلاث "Handel" و"Händel" و"Haendel" باستخدام النمط `<Handel> H(ä|ae?)ndel`؛ نقول إن هذا النمط يُطابق كل سلسلة من السلاسل الثلاث. مع ذلك، توجد طرق عديدة لكتابة تعبير نمطي لنفس مجموعة السلاسل النصية: على سبيل المثال، (Hän|Han|Haen)delيُحدد التعبير النمطي `<Handel>` أيضًا نفس مجموعة السلاسل الثلاث في هذا المثال.

توفر معظم النماذج الرسمية العمليات التالية لإنشاء التعبيرات النمطية.

"أو" المنطقي
يفصل خط عمودي بين البدائل. على سبيل المثال، يمكن مطابقة "رمادي" أو "رمادي".gray|grey
التجميع
تُستخدم الأقواس لتحديد نطاق وأسبقية المعاملات ( من بين استخدامات أخرى). على سبيل المثال، تُعدّ كل gray|greyمن و نمطين متكافئين يصفان مجموعة "الرمادي" أو "الرمادي".gr(a|e)y
التحديد الكمي
يُحدد المُحدد الكمي الذي يلي عنصرًا ما (مثل رمز أو حرف أو مجموعة) عدد مرات تكرار العنصر السابق. ومن أكثر المحددات الكمية شيوعًا علامة الاستفهام? ، والنجمة* (المشتقة من نجمة كلينوعلامة الجمع+ ( كلين بلس ).
?تشير علامة الاستفهام إلى عدم وجود العنصر السابق أو وجوده مرة واحدة فقطcolou?r . على سبيل المثال، يطابق كلاً من "color" و "colour".
*تشير علامة النجمة إلى صفر أو أكثر من مرات ظهور العنصر السابق. على سبيل المثال، ab*cيطابق "ac" و"abc" و"abbc" و"abbbc" وهكذا.
+تشير علامة الجمع إلى ظهور العنصر السابق مرة واحدة أو أكثرab+c . على سبيل المثال، يطابق "abc" و"abbc" و"abbbc" وما إلى ذلك، ولكنه لا يطابق "ac".
{n}[ 23 ]تمت مطابقة العنصر السابق بالضبط n مرة.
{min,}[ 23 ]تمت مطابقة العنصر السابق 8 مرات أو أكثر.
{,max}[ 23 ]تتم مطابقة العنصر السابق حتى الحد الأقصى من المرات.
{min,max}[ 23 ]تمت مطابقة العنصر السابق على الأقل لعدد أدنى من المرات، ولكن ليس أكثر من عدد أقصى من المرات.
بطاقة جامحة
يُطابق الرمز البديل .أي حرف. على سبيل المثال،
a.bيطابق أي سلسلة تحتوي على "a"، ثم أي حرف، ثم "b".
a.*bيطابق أي سلسلة تحتوي على الحرف "a"، ثم الحرف "b" في نقطة لاحقة.

يمكن دمج هذه التركيبات لتشكيل تعبيرات معقدة بشكل تعسفي، تمامًا كما يمكن للمرء أن يبني تعبيرات حسابية من الأرقام والعمليات + و - و × و ÷.

تختلف الصيغة الدقيقة للتعبيرات النمطية بين الأدوات ومع السياق؛ يتم تقديم المزيد من التفاصيل في قسم  الصيغة .

نظرية اللغة الرسمية

تصف التعابير النمطية اللغات المنتظمة في نظرية اللغات الرسمية . ولها نفس القدرة التعبيرية للقواعد النحوية المنتظمة . لكن لغة التعابير النمطية نفسها هي لغة خالية من السياق .

التعريف الرسمي

تتكون التعابير النمطية من ثوابت، تُمثل مجموعات من السلاسل النصية، ورموز عمليات، تُمثل عمليات تُجرى على هذه المجموعات. التعريف التالي هو تعريف معياري، ويُوجد على هذا النحو في معظم كتب نظرية اللغات الرسمية. [ 24 ] [ 25 ] بالنظر إلى أبجدية محدودة Σ، تُعرَّف الثوابت التالية على أنها تعابير نمطية:

  • ( مجموعة فارغة ) ∅ تشير إلى المجموعة ∅.
  • ( سلسلة فارغة ) ε تشير إلى المجموعة التي تحتوي فقط على السلسلة "الفارغة"، والتي لا تحتوي على أي أحرف على الإطلاق.
  • ( حرف حرفي ) aفي Σ يشير إلى المجموعة التي تحتوي فقط على الحرف a .

بالنظر إلى التعبيرات النمطية R و S، يتم تعريف العمليات التالية عليها لإنتاج التعبيرات النمطية:

  • يشير مصطلح ( الدمج ) (RS)إلى مجموعة السلاسل النصية التي يمكن الحصول عليها من خلال دمج سلسلة نصية مقبولة في R مع سلسلة نصية مقبولة في S (بهذا الترتيب). على سبيل المثال، إذا رمزنا لـ R بـ {"ab", "c"} ولـ S بـ {"d", "ef"}. فإنّ (الدمج) (RS)يرمز إلى {"abd", "abef", "cd", "cef"}.
  • يشير ( التناوب ) إلى اتحاد المجموعات الموصوفة بواسطة R و S. على سبيل المثال، إذا كانت R تصف {"ab", "c"} و S تصف {"ab", "d", "ef"}، فإن التعبير يصف {"ab", "c", "d", "ef"}.(R|S)(R|S)
  • يرمز ( نجمة كلين ) (R*)إلى أصغر مجموعة جزئية من المجموعة R التي تحتوي على ε وتكون مغلقة تحت عملية دمج السلاسل. هذه هي مجموعة جميع السلاسل التي يمكن تكوينها بدمج أي عدد محدود (بما في ذلك الصفر) من السلاسل من المجموعة R. على سبيل المثال، إذا كانت R ترمز إلى {"0", "1"}، فإن ε (R*)ترمز إلى مجموعة جميع السلاسل الثنائية المحدودة (بما في ذلك السلسلة الفارغة). إذا كانت R ترمز إلى {"ab", "c"}، (R*)فإن ε ترمز إلى {ε, "ab", "c", "abab", "abc", "cab", "cc", "ababab", "abcab", ...}.

لتجنب استخدام الأقواس، يُفترض أن يكون لنجمة كلين الأولوية القصوى، تليها عملية الربط، ثم التناوب. إذا لم يكن هناك أي لبس، فيمكن حذف الأقواس. على سبيل المثال، (ab)cيمكن كتابة على النحو التالي abc: ، a|(b(c*))ويمكن كتابة على النحو التالي a|bc*: . تستخدم العديد من الكتب الدراسية الرموز ∪، +، أو ∨ للتناوب بدلاً من الخط العمودي.

أمثلة:

  • a|b*يرمز إلى {ε, "a", "b", "bb", "bbb", ...}
  • (a|b)*يشير إلى مجموعة جميع السلاسل التي لا تحتوي على رموز أخرى غير "a" و "b"، بما في ذلك السلسلة الفارغة: {ε, "a", "b", "aa", "ab", "ba", "bb", "aaa", ...}
  • ab*(c|ε)يشير إلى مجموعة السلاسل التي تبدأ بالحرف "a"، ثم صفر أو أكثر من الأحرف "b"، وأخيراً اختيارياً الحرف "c": {"a", "ac", "ab", "abc", "abb", "abbc", ...}
  • (0|(1(01*0)*1))*يشير إلى مجموعة الأعداد الثنائية التي هي مضاعفات للعدد 3: { ε, "0", "00", "11", "000", "011", "110", "0000", "0011", "0110", "1001", "1100", "1111", "00000", ...}

يمكن تعريف مشتق التعبير النمطي باستخدام مشتق برزوزوفسكي .

قوة تعبيرية وكثافة

التعريف الرسمي للتعبيرات النمطية مُختصرٌ عمدًا، ويتجنب تعريف ?و +- حيث يمكن التعبير عنهما كما يلي: a+= aa*و a?= (a|ε). أحيانًا يُضاف عامل المُكمِّل ، لإعطاء تعبير نمطي مُعمَّم ؛ هنا R c يُطابق جميع السلاسل فوق Σ* التي لا تُطابق R. من حيث المبدأ، عامل المُكمِّل زائد، لأنه لا يُضيف أي قدرة تعبيرية إضافية. ومع ذلك، يُمكنه جعل التعبير النمطي أكثر إيجازًا - حذف عامل مُكمِّل واحد يُمكن أن يُؤدي إلى زيادة طوله بشكل كبير . [ 26 ] [ 27 ] [ 28 ]

يمكن للتعبيرات النمطية، بهذا المعنى، أن تعبر عن اللغات المنتظمة، وهي تحديدًا فئة اللغات التي تقبلها الأوتوماتا المحدودة الحتمية . مع ذلك، ثمة فرق جوهري في التماسك. فبعض فئات اللغات المنتظمة لا يمكن وصفها إلا بواسطة أوتوماتا محدودة حتمية، يزداد حجمها أُسّيًا مع ازدياد حجم أقصر التعبيرات النمطية المكافئة لها. والمثال القياسي هنا هو اللغة Lₖ التي تتكون من جميع السلاسل النصية على الأبجدية { a , b } التي يكون حرفها قبل الأخير k مساويًا للحرف a . من جهة أخرى، يُعطى التعبير النمطي الذي يصف Lₖ كما يلي : (أ|ب)*أ(أ|ب)(أ|ب)(أ|ب){\displaystyle (a\mid b)^{*}a(a\mid b)(a\mid b)(a\mid b)}.

بتعميم هذا النمط إلى L k نحصل على التعبير التالي:

(أ|ب)*أ(أ|ب)(أ|ب)(أ|ب)ك-1 أوقات.{\displaystyle (a\mid b)^{*}a\underbrace {(a\mid b)(a\mid b)\cdots (a\mid b)} _{k-1{\text{ مرات}}}.\,}

من جهة أخرى، من المعروف أن كل آلة حالة منتهية حتمية تقبل اللغة L k يجب أن تحتوي على 2 k حالة على الأقل . ولحسن الحظ، توجد عملية ربط بسيطة من التعابير النمطية إلى آلات الحالة المنتهية غير الحتمية (NFAs) الأكثر عمومية، والتي لا تؤدي إلى تضخم كبير في الحجم؛ ولهذا السبب تُستخدم آلات الحالة المنتهية غير الحتمية غالبًا كتمثيلات بديلة للغات النمطية. تُعد آلات الحالة المنتهية غير الحتمية شكلًا مبسطًا من قواعد النوع 3 في تسلسل تشومسكي الهرمي . [ 24 ]

في المقابل، توجد لغات عديدة يسهل وصفها باستخدام آلة الحالة المحدودة الحتمية (DFA)، بينما يصعب وصفها باستخدام التعبيرات النمطية. على سبيل المثال، يتطلب تحديد صحة رقم ISBN معين حساب باقي قسمة عدد صحيح على 11، ويمكن تنفيذ ذلك بسهولة باستخدام آلة حالة محدودة حتمية ذات 11 حالة. مع ذلك، ينتج عن تحويلها إلى تعبير نمطي ملف بحجم 2.14 ميجابايت. [ 29 ]

عند إعطاء تعبير نمطي، تحسب خوارزمية تومسون للإنشاء آلةً محدودةً غير حتمية مكافئة. ويتم تحقيق التحويل في الاتجاه المعاكس بواسطة خوارزمية كلين .

أخيرًا، تُطبّق العديد من محركات "التعبيرات النمطية" في العالم الحقيقي خصائص لا يمكن وصفها بالتعبيرات النمطية بالمعنى النظري للغة الرسمية؛ بل تُطبّق تعبيرات نمطية . انظر أدناه لمزيد من المعلومات حول هذا الموضوع.

تحديد تكافؤ التعبيرات النمطية

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

من الممكن كتابة خوارزمية تقوم، بالنسبة لتعبيرين منتظمين معطيين، بتحديد ما إذا كانت اللغات الموصوفة متساوية؛ تقوم الخوارزمية باختزال كل تعبير إلى آلة حالة محدودة حتمية دنيا ، وتحدد ما إذا كانت متماثلة (متكافئة).

يمكن استخلاص القوانين الجبرية للتعبيرات النمطية باستخدام طريقة غيشر، والتي يُوضحها المثال التالي: للتحقق مما إذا كان التعبيران ( X + Y ) * و( X * Y * ) * يُمثلان اللغة النمطية نفسها، فإنه بالنسبة لجميع التعبيرات النمطية X و Y ، يكفي التحقق مما إذا كان التعبيران النمطيان ( a + b ) * و( a * b * ) * يُمثلان اللغة نفسها على الأبجدية Σ = { a , b }. وبشكل أعم، تتحقق المعادلة E = F بين حدود التعبير النمطي التي تحتوي على متغيرات إذا، وفقط إذا، تحققت المعادلة باستبدال متغيرات مختلفة بثوابت رمزية مختلفة. [ 30 ] [ 31 ]

يمكن كتابة كل تعبير نمطي باستخدام نجمة كلين واتحادات المجموعات على الكلمات المحدودة فقط. هذه مشكلة معقدة بشكلٍ مفاجئ. فعلى الرغم من بساطة التعبيرات النمطية، لا توجد طريقة لإعادة كتابتها بشكل منهجي إلى شكل طبيعي. وقد أدى غياب البديهيات في الماضي إلى مشكلة ارتفاع النجمة . في عام 1991، وضع ديكستر كوزين بديهيات للتعبيرات النمطية كجبر كلين ، باستخدام بديهيات المعادلات وبديهيات بنود هورن . [ 32 ] وكان ريدكو قد أثبت في عام 1964 أنه لا يمكن لأي مجموعة محدودة من بديهيات المعادلات البحتة أن تصف جبر اللغات المنتظمة. [ 33 ]

بناء الجملة

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

يوجد حوالي أربعة عشر حرفًا خاصًا، بحسب معالج التعبيرات النمطية، وهي أحرف قد تحمل معناها الحرفي أو لا ، وذلك تبعًا للسياق، أو ما إذا كانت مسبوقة بتسلسل هروب ، وهو في هذه الحالة الشرطة المائلة العكسية \. تستخدم التعبيرات النمطية الحديثة والموسعة وفقًا لمعيار POSIX الأحرف الخاصة أكثر من معناها الحرفي، ولتجنب "الخطأ الناتج عن الشرطة المائلة العكسية" أو ما يُعرف بـ"متلازمة عود الأسنان " ، فإنها تتضمن آلية هروب للأحرف الخاصة إلى الوضع الحرفي؛ ولكن في البداية، تكون الأحرف الخاصة الأربعة الموجودة بين قوسين حرفية في المقام الأول ، ثم "تتخلص" من هذا المعنى المعتاد لتصبح أحرفًا خاصة. وتُطبق المعايير الشائعة كلا الأمرين. الأحرف الخاصة الشائعة هي و . أما الأحرف الشائعة التي تصبح أحرفًا خاصة عند الهروب منها فهي و .( ){ } {}[]()^$.|*+?\dswDSWN

المحددات

عند إدخال تعبير نمطي (regex) في لغة برمجة، قد يُكتب كسلسلة نصية عادية، ولذلك يُحاط عادةً بعلامات اقتباس؛ وهذا شائع في لغات مثل C وJava وPython، حيث reيُكتب التعبير النمطي كالتالي: `regex "re".`. مع ذلك، غالبًا ما تُكتب باستخدام الشرطات المائلة كفواصل ، كما في /re/التعبير النمطي `regex re.`. يعود أصل هذا إلى محرر النصوص ed ، حيث يُستخدم الأمر `.` للبحث، ويمكن استخدام تعبير لتحديد نطاق من الأسطر (يطابق النمط)، والذي يمكن دمجه مع أوامر أخرى على كلا الجانبين، وأشهرها الأمر ` grep` ( "طباعة التعبير النمطي العام")، المُضمن في معظم أنظمة التشغيل المبنية على Unix ، مثل توزيعات Linux . يُستخدم اصطلاح مشابه في الأمر sed ، حيث يُستخدم الأمر `.` للبحث والاستبدال ، ويمكن ربط الأنماط بفاصلة لتحديد نطاق من الأسطر كما في ` .`. تشتهر هذه الصيغة بشكل خاص لاستخدامها في لغة Perl ، حيث تُشكل جزءًا من بناء الجملة المُميز عن السلاسل النصية العادية. في بعض الحالات، كما هو الحال في sed وPerl، يمكن استخدام فواصل بديلة لتجنب التعارض مع المحتوى، ولتجنب الحاجة إلى استخدام رمز الهروب عند ظهور الفاصل في المحتوى. على سبيل المثال، في sed، سيستبدل الأمر a بـ an ، باستخدام الفواصل كفواصل.//re/g/re/ps/re/replacement//re1/,/re2/s,/,X,/X

معيار IEEE POSIX

يتضمن معيار IEEE POSIX ثلاث مجموعات من التوافق: BRE (التعابير النمطية الأساسية)، [ 34 ] وERE (التعابير النمطية الموسعة)، و SRE (التعابير النمطية البسيطة). تم إيقاف استخدام SRE ، [ 35 ] لصالح BRE، حيث يوفر كلاهما توافقًا مع الإصدارات السابقة . ينطبق القسم الفرعي أدناه الذي يتناول فئات الأحرف على كل من BRE وERE.

يعمل كل من BRE وERE معًا. يضيف ERE علامات الترقيم ?، +و، و |، ويُلغي الحاجة إلى تهريب الأحرف الخاصة و ، المطلوبة في BRE. علاوة على ذلك، طالما يتم الالتزام بصيغة POSIX القياسية للتعبيرات النمطية، يمكن، وغالبًا ما يكون هناك، صيغة إضافية لخدمة تطبيقات محددة (متوافقة مع POSIX). على الرغم من أن POSIX.2 يترك بعض تفاصيل التنفيذ غير محددة، فإن BRE وERE يوفران "معيارًا" تم اعتماده منذ ذلك الحين كصيغة افتراضية للعديد من الأدوات، حيث يكون اختيار وضع BRE أو ERE خيارًا مدعومًا عادةً. على سبيل المثال، لدى GNU الخيارات التالية: " " لـ ERE، و " " لـ BRE (الافتراضي)، و " " لتعبيرات Perl النمطية.( ){ }grepgrep -Egrep -Ggrep -P

أصبحت تعابير Perl النمطية معيارًا فعليًا، لما تتمتع به من مجموعة غنية وقوية من التعبيرات الذرية. لا يوجد في Perl مستويات "أساسية" أو "موسعة". وكما هو الحال في تعابير POSIX النمطية الموسعة، تُعامل الأحرف النمطية كأحرف خاصة ما لم يتم تهريبها؛ أما الأحرف الخاصة الأخرى، فيُعرف أنها حرفية أو رمزية بناءً على السياق فقط. تشمل الوظائف الإضافية المطابقة الكسولة ، والمراجع الخلفية ، ومجموعات الالتقاط المسماة، والأنماط المتكررة .( ){ }

POSIX الأساسي والموسع

في معيار POSIX ، يتطلب بناء الجملة العادي الأساسي ( BRE ) أن يتم تعيين الأحرف الخاصة و ، بينما لا يتطلب بناء الجملة العادي الموسع ( ERE ) ذلك.( ){ }\(\)\{\}

الشخصية الميتافيزيقيةوصف
^يُطابق موضع البداية داخل السلسلة النصية. في الأدوات التي تعتمد على الأسطر، يُطابق موضع بداية أي سطر.
.يُطابق هذا الرمز أي حرف منفرد (تستثني العديد من التطبيقات أسطرًا جديدة ، وتختلف الأحرف التي تُعتبر أسطرًا جديدة باختلاف نوع التطبيق، وتشفير الأحرف، والمنصة، ولكن من الآمن افتراض أن حرف تغذية السطر مُضمن). ضمن تعبيرات الأقواس في نظام POSIX، يُطابق رمز النقطة نقطة حرفية. على سبيل المثال، a.cيُطابق الرمز "abc" وما إلى ذلك، بينما [a.c]يُطابق الرمز "a" أو "." أو "c" فقط.
[ ]تعبير بين قوسين. يطابق حرفًا واحدًا موجودًا بين القوسين. على سبيل المثال، [abc]يطابق "a" أو "b" أو "c". [a-z]يحدد نطاقًا يطابق أي حرف صغير من "a" إلى "z". يمكن دمج هذه الأشكال: [abcx-z]يطابق "a" أو "b" أو "c" أو "x" أو "y" أو "z"، كما يفعل [a-cx-z].

-يُعامل الحرف كحرفٍ حرفي إذا كان الحرف الأخير أو الأول (بعد الفاصلة ، ^إن وُجدت) داخل الأقواس: [abc-]، [-abc]، [^-abc]. لا يُسمح باستخدام علامات الهروب (الشرطة المائلة العكسية). ]يمكن تضمين الحرف في تعبير الأقواس إذا كان ^الحرف الأول (بعد الفاصلة، إن وُجدت): []abc]، [^]abc].

[^ ]يُطابق حرفًا واحدًا غير موجود بين القوسين. على سبيل المثال، [^abc]يُطابق أي حرف عدا "a" أو "b" أو "c". [^a-z]يُطابق أي حرف ليس حرفًا صغيرًا من "a" إلى "z". وبالمثل، يمكن مزج الأحرف الحرفية والنطاقات.
$يُطابق موضع نهاية السلسلة أو الموضع الذي يسبق سطرًا جديدًا في نهاية السلسلة. في الأدوات التي تعتمد على الأسطر، يُطابق موضع نهاية أي سطر.
( )يُعرّف هذا الأمر تعبيرًا فرعيًا مُعلّمًا، يُسمى أيضًا مجموعة التقاط، وهو ضروري لاستخراج الجزء المطلوب من النص (انظر أيضًا المدخل التالي ). يتطلب وضع BRE هذا الأمر .\n\( \)
\nيطابق هذا التعبير الفرعي المُعلَّم رقم n ، حيث n رقم من 1 إلى 9. هذا التركيب مُعرَّف في معيار POSIX. [ 36 ] تسمح بعض الأدوات بالإشارة إلى أكثر من تسع مجموعات التقاط. تُعرف هذه الميزة أيضًا باسم الإشارة المرجعية الخلفية، وهي مدعومة في وضع BRE.
*يطابق العنصر السابق صفرًا أو أكثر من المرات. على سبيل المثال، ab*cيطابق "ac" و"abc" و"abbbc" وما إلى ذلك. [xyz]*يطابق "" و"x" و"y" و"z" و"zx" و"zyx" و"xyzzy" وما إلى ذلك. (ab)*يطابق "" و"ab" و"abab" و"ababab" وما إلى ذلك.
{m,n}يطابق العنصر السابق من m إلى n مرة على الأقل. على سبيل المثال، a{3,5}يطابق فقط "aaa" و"aaaa" و"aaaaa". هذا غير موجود في بعض الإصدارات القديمة من التعبيرات النمطية. يتطلب وضع BRE استخدام .\{m,n\}

أمثلة:

  • .atيطابق أي سلسلة مكونة من ثلاثة أحرف تنتهي بـ "at"، بما في ذلك "hat" و "cat" و "bat" و "4at" و "#at" و "at" (التي تبدأ بمسافة).
  • [hc]atيتطابق مع "قبعة" و "قطة".
  • [^b]atيطابق جميع السلاسل التي تطابقها .atباستثناء "bat".
  • [^hc]atيطابق جميع السلاسل التي تمت مطابقتها .atباستثناء "hat" و "cat".
  • ^[hc]atيطابق "hat" و "cat"، ولكن فقط في بداية السلسلة أو السطر.
  • [hc]at$يطابق "hat" و "cat"، ولكن فقط في نهاية السلسلة أو السطر.
  • \[.\]يطابق أي حرف واحد محاط بـ "[" و "]" لأن الأقواس يتم هروبها، على سبيل المثال: "[a]", "[b]", "[7]", "[@]", "[]]", و "[ ]" (قوس مسافة قوس).
  • s.*يطابق s متبوعًا بصفر أو أكثر من الأحرف، على سبيل المثال: "s"، "saw"، "seed"، "s3w96.7"، و "s6#h%(>>>mn mQ).

بحسب روس كوكس، تتطلب مواصفات POSIX معالجة التعبيرات الفرعية الغامضة بطريقة مختلفة عن تلك المتبعة في لغة بيرل. استبدلت اللجنة قواعد بيرل بقواعد سهلة الشرح، إلا أن هذه القواعد "البسيطة" الجديدة أكثر تعقيدًا في التطبيق: فهي غير متوافقة مع الأدوات الموجودة مسبقًا، وجعلت من المستحيل عمليًا تعريف امتداد "المطابقة الكسولة" (انظر أدناه). ونتيجة لذلك، فإن عددًا قليلًا جدًا من البرامج يُطبّق قواعد التعبيرات الفرعية في POSIX (حتى عند تطبيقها لأجزاء أخرى من بنية POSIX). [ 37 ]

الأحرف الخاصة في POSIX الموسعة

في صيغة POSIX Extended Regular Expression ( ERE )، ينعكس معنى الأحرف الخاصة التي يتم تهريبها باستخدام شرطة مائلة عكسية لبعض الأحرف . في هذه الصيغة، تُعامل الشرطة المائلة العكسية الحرف الخاص كحرف عادي. على سبيل المثال، أصبح الحرف الخاص الآن هو الحرف العادي ، وأصبح الحرف الخاص الآن هو الحرف العادي. بالإضافة إلى ذلك، تم إزالة دعم المراجع الخلفية، وأُضيفت الأحرف الخاصة التالية:\( \)( )\{ \}{ }\n

الشخصية الميتافيزيقيةوصف
?يطابق العنصر السابق صفرًا أو مرة واحدة. على سبيل المثال، ab?cيطابق "ac" أو "abc" فقط.
+يطابق العنصر السابق مرة واحدة أو أكثر. على سبيل المثال، ab+cيطابق "abc" و"abbc" و"abbbc" وما إلى ذلك، ولكنه لا يطابق "ac".
|يُطابق عامل الاختيار (المعروف أيضًا باسم عامل التناوب أو عامل اتحاد المجموعات) إما التعبير الذي يسبق العامل أو التعبير الذي يليه. على سبيل المثال، abc|defيُطابق "abc" أو "def".

أمثلة:

  • [hc]?atيطابق "at" و "hat" و "cat".
  • [hc]*atيطابق "at" و "hat" و "cat" و "hhat" و "chat" و "hcat" و "cchchat" وما إلى ذلك.
  • [hc]+atيطابق "hat" و "cat" و "hhat" و "chat" و "hcat" و "cchchat" وما إلى ذلك، ولكن ليس "at".
  • cat|dogيطابق "قطة" أو "كلب".

يمكن استخدام التعبيرات النمطية الموسعة POSIX غالبًا مع أدوات Unix الحديثة عن طريق تضمين علامة سطر الأوامر -E .

فئات الشخصيات

يُعدّ صنف الأحرف المفهوم الأساسي في التعبيرات النمطية بعد المطابقة الحرفية. فهو يُطابق سلسلة صغيرة من الأحرف مع مجموعة أكبر من الأحرف. على سبيل المثال، [A-Z]قد يُمثّل الحرف 1 أي حرف كبير في الأبجدية الإنجليزية، بينما قد يُمثّل الحرف 2 أي رقم. وتُطبّق أصناف الأحرف على كلا مستويي POSIX.\d

عند تحديد نطاق من الأحرف، مثل [a-Z](من الأحرف الصغيرة aإلى الأحرف الكبيرة Z)، تحدد إعدادات اللغة في الحاسوب المحتوى بناءً على الترتيب العددي لترميز الأحرف. يمكن تخزين الأرقام بهذا التسلسل، أو قد يكون الترتيب abc...zABC...Z ، أو aAbBcC...zZ . لذا، يُعرّف معيار POSIX فئة أحرف، يتعرف عليها معالج التعبيرات النمطية المُثبّت. تجدون هذه التعريفات في الجدول التالي:

وصفبوسيكسبيرل/تكلهمةجافاASCII
أحرف ASCII\p{ASCII}[\x00-\x7F]
الأحرف الأبجدية الرقمية[:alnum:]\p{Alnum}[A-Za-z0-9]
الأحرف الأبجدية الرقمية بالإضافة إلى "_"\w\w\w[A-Za-z0-9_]
شخصيات غير لفظية\W\W\W[^A-Za-z0-9_]
الأحرف الأبجدية[:alpha:]\a\p{Alpha}[A-Za-z]
المسافة والجدولة[:blank:]\s\p{Blank}[ \t]
حدود الكلمات\b\< \>\b(?<=\W)(?=\w)|(?<=\w)(?=\W)
حدود غير لفظية\B(?<=\W)(?=\W)|(?<=\w)(?=\w)
التحكم في الشخصيات[:cntrl:]\p{Cntrl}[\x00-\x1F\x7F]
أرقام[:digit:]\d\d\p{Digit}أو\d[0-9]
غير الأرقام\D\D\D[^0-9]
الشخصيات المرئية[:graph:]\p{Graph}[\x21-\x7E]
الأحرف الصغيرة[:lower:]\l\p{Lower}[a-z]
الشخصيات المرئية وشخصية الفضاء[:print:]\p\p{Print}[\x20-\x7E]
علامات الترقيم[:punct:]\p{Punct}[][!"#$%&'()*+,./:;<=>?@\^_`{|}~-]
أحرف المسافة البيضاء[:space:]\s\_s\p{Space}أو\s[ \t\r\n\v\f]
الأحرف غير البيضاء\S\S\S[^ \t\r\n\v\f]
الأحرف الكبيرة[:upper:]\u\p{Upper}[A-Z]
الأرقام السداسية عشرية[:xdigit:]\x\p{XDigit}[A-Fa-f0-9]

لا يمكن استخدام فئات أحرف POSIX إلا ​​داخل تعبيرات الأقواس. على سبيل المثال، يطابق الأحرف الكبيرة و"a" و"b" الصغيرة.[[:upper:]ab]

هناك فئة إضافية غير متوافقة مع معيار POSIX، تفهمها بعض الأدوات [:word:]، وهي `<word>`، والتي تُعرَّف عادةً بـ ` [:alnum:]<word>` متبوعة بشرطة سفلية. يعكس هذا حقيقة أن هذه الأحرف هي التي يمكن استخدامها في المعرّفات في العديد من لغات البرمجة. يُفرِّق محرر النصوص Vim بين فئتي `<word> ` و`< word-head> ` (باستخدام الترميز `<word> ` و`< word-head>`)، حيث أن الأحرف التي يمكن أن تبدأ بها المعرّفات في العديد من لغات البرمجة تختلف عن تلك التي يمكن أن تظهر في مواضع أخرى: فالأرقام تُستثنى عمومًا، لذا سيبدو المعرّف على النحو التالي في ترميز POSIX: `<word>` أو `<word-head>`.\w\h\h\w*[[:alpha:]_][[:alnum:]_]*

تجدر الإشارة إلى أن ما يُطلق عليه معيار POSIX للتعبيرات النمطية اسم "فئات الأحرف" يُشار إليه عادةً باسم "فئات أحرف POSIX" في أنواع التعبيرات النمطية الأخرى التي تدعمها. في معظم أنواع التعبيرات النمطية الأخرى، يُستخدم مصطلح " فئة الأحرف" لوصف ما يُطلق عليه معيار POSIX اسم "تعبيرات الأقواس" .

بيرل و PCRE

نظرًا لقدرتها التعبيرية وسهولة قراءتها (نسبيًا)، اعتمدت العديد من الأدوات ولغات البرمجة الأخرى بنيةً مشابهةً لبنية لغة بيرل ، مثل جافا ، وجافا سكريبت ، وجوليا ، وبايثون ، وروبي ، وQt ، وإطار عمل .NET من مايكروسوفت ، ومخطط XML . تدعم بعض اللغات والأدوات، مثل Boost و PHP، أنواعًا متعددة من التعبيرات النمطية. لا تتطابق تطبيقات التعبيرات النمطية المشتقة من بيرل تمامًا، وعادةً ما تُطبّق مجموعةً فرعيةً من الميزات الموجودة في بيرل 5.0، التي صدرت عام 1994. أحيانًا تُدمج بيرل ميزاتٍ وُجدت في الأصل في لغاتٍ أخرى. على سبيل المثال، تُطبّق بيرل 5.10 امتداداتٍ نحويةً طُوّرت في الأصل في PCRE وبايثون. [ 38 ]

المطابقة الكسولة

في لغة بايثون وبعض التطبيقات الأخرى (مثل جافا)، تكون المحددات الكمية الثلاثة الشائعة ( *، +و، و ?) جشعة افتراضيًا لأنها تطابق أكبر عدد ممكن من الأحرف. [ 39 ] يتم تطبيق التعبير النمطي ".+"(بما في ذلك علامات الاقتباس المزدوجة) على السلسلة

وتابع قائلاً: "غانيميد هو أكبر قمر في المجموعة الشمسية".

يطابق السطر بأكمله (لأن السطر بأكمله يبدأ وينتهي بعلامة اقتباس مزدوجة) بدلاً من مطابقة الجزء الأول فقط "Ganymede,". ومع ذلك، يمكن جعل المحددات الكمية المذكورة أعلاه كسولة أو بسيطة أو مترددة ، بحيث تطابق أقل عدد ممكن من الأحرف، وذلك بإضافة علامة استفهام: ".+?"يطابق فقط "Ganymede,". [ 39 ]

المطابقة الملكية

في Java و Python 3.11 والإصدارات الأحدث، [ 40 ] يمكن جعل المحددات الكمية ملكية بإضافة علامة زائد، مما يعطل التراجع (في محرك التراجع)، حتى لو كان ذلك سيسمح بنجاح المطابقة الكلية: [ 41 ] بينما يتم تطبيق التعبير النمطي ".*"على السلسلة

وتابع قائلاً: "غانيميد هو أكبر قمر في المجموعة الشمسية".

يطابق السطر بأكمله، بينما لا يطابق التعبير النمطي ".*+"على الإطلاق ، لأنه .*+يستهلك المدخلات بأكملها، بما في ذلك النقطة الأخيرة ". لذا، فإن المحددات الكمية الملكية تكون أكثر فائدة مع فئات الأحرف المنفية، على سبيل المثال "[^"]*+"، والتي تطابق "Ganymede,"عند تطبيقها على نفس السلسلة.

هناك امتداد شائع آخر يؤدي الوظيفة نفسها وهو التجميع الذري، الذي يعطل التراجع لمجموعة بين قوسين. الصيغة النموذجية هي (? > group) . على سبيل المثال، بينما يطابق ^(wi|w)i$ كلاً من wi و wii ، فإن ^(? > wi|w)i$ يطابق wii فقط لأن المحرك ممنوع من التراجع، وبالتالي لا يمكنه محاولة تعيين المجموعة إلى "w" بعد مطابقة "wi". [ 42 ]

تُعدّ أدوات التحديد الكمية الملكية أسهل في التنفيذ من أدوات التحديد الكمية الجشعة والكسولة، وعادةً ما تكون أكثر كفاءة أثناء التشغيل. [ 41 ]

IETF I-Regexp

يصف معيار IETF RFC 9485 "I-Regexp: تنسيق تعبير نمطي قابل للتشغيل البيني". ويحدد مجموعة فرعية محدودة من تعابير النمط المصممة لتكون قابلة للتشغيل البيني، أي لإنتاج نفس التأثير، في عدد كبير من مكتبات التعبيرات النمطية. كما يقتصر I-Regexp على المطابقة، أي توفير تطابق صحيح أو خاطئ بين تعبير نمطي ونص معين. وبالتالي، فهو يفتقر إلى ميزات متقدمة مثل مجموعات الالتقاط، والنظر المسبق، والمراجع الخلفية. [ 43 ]

أنماط اللغات غير المنتظمة

توفر العديد من الميزات الموجودة في جميع مكتبات التعبيرات النمطية الحديثة تقريبًا قوة تعبيرية تتجاوز اللغات النمطية . على سبيل المثال، تسمح العديد من التطبيقات بتجميع التعبيرات الفرعية باستخدام الأقواس واستدعاء القيمة التي تطابقها في نفس التعبير (المراجع الخلفية ). هذا يعني، من بين أمور أخرى، أن النمط يمكن أن يطابق سلاسل من الكلمات المتكررة مثل "بابا" أو "ويكي ويكي"، والتي تُسمىمربعاتفي نظرية اللغة الرسمية. نمط هذه السلاسل هو(.+)\1.

لغة المربعات ليست منتظمة، وليست خالية من السياق ، وذلك بسبب معضلة الضخ . ومع ذلك، فإن مطابقة الأنماط مع عدد غير محدود من المراجع الخلفية، كما تدعمها العديد من الأدوات الحديثة، لا تزال حساسة للسياق . [ 44 ] تُعدّ مشكلة مطابقة أي عدد من المراجع الخلفية مشكلةً كاملةً من فئة NP ، ويتزايد وقت تنفيذ الخوارزميات المعروفة أُسّيًا مع ازدياد عدد مجموعات المراجع الخلفية المستخدمة. [ 45 ]

مع ذلك، لا تزال العديد من الأدوات والمكتبات والمحركات التي توفر هذه البنى تستخدم مصطلح " التعبير النمطي" لوصف أنماطها. وقد أدى ذلك إلى ظهور مصطلحات مختلفة، حيث يحمل مصطلح "التعبير النمطي" معانيَ مختلفة في نظرية اللغات الرسمية ومطابقة الأنماط. ولهذا السبب، لجأ البعض إلى استخدام مصطلحات مثل regex أو regexp أو ببساطة pattern لوصف النمط. يكتب لاري وول ، مؤلف لغة البرمجة بيرل، في مقال عن تصميم راكو:

إنّ مصطلح "التعابير النمطية" [...] لا يرتبط ارتباطًا وثيقًا بالتعابير النمطية الحقيقية. ومع ذلك، فقد تطور هذا المصطلح مع تطور قدرات محركات مطابقة الأنماط لدينا، لذا لن أحاول هنا مخالفة الضرورة اللغوية. ومع ذلك، سأستخدم مصطلح "regex" (أو "regexen" عندما أكون في مزاجٍ لغويٍّ أنجلو-ساكسوني). [ 19 ]

التأكيدات

التأكيدانظر إلى الوراءنظرة مستقبلية
إيجابي(?<=pattern)(?=pattern)
سلبي(?<!pattern)(?!pattern)
تأكيدات التطلع للخلف والتطلع للأمام في التعبيرات النمطية في لغة بيرل

تتضمن الميزات الأخرى غير الموجودة في وصف اللغات العادية التأكيدات. وتشمل هذه التأكيدات ^التأكيدات الشائعة $، مثل التأكيدات والتأكيدات، المستخدمة منذ عام 1970 على الأقل، [ 46 ] بالإضافة إلى بعض الامتدادات الأكثر تطورًا مثل البحث المحيطي الذي ظهر عام 1994. [ 47 ] يحدد البحث المحيطي محيط التطابق ولا يتداخل مع التطابق نفسه، وهي ميزة ذات صلة فقط بحالة استخدام البحث عن السلاسل النصية. يمكن محاكاة بعض هذه التأكيدات في لغة عادية من خلال اعتبار المحيط جزءًا من اللغة أيضًا. [ 48 ]

ال تم توثيق تأكيدات التطلع إلى الأمام منذ عام 1994 على الأقل، بدءًا من بيرل 5.(?=...)[ 47 ] تم توثيق تأكيداتالتطلع إلى الخلفمنذ عام 1997 في تعديل قام به إيليا زاخاريفيتش إلى بيرل 5.005. [ 49 ](?!...)(?<=...)(?<!...)

التنفيذات وأوقات التشغيل

هناك ثلاث خوارزميات مختلفة على الأقل تحدد ما إذا كان التعبير النمطي المعطى يطابق سلسلة نصية وكيف يتم ذلك.

تعتمد الطريقة الأقدم والأسرع على نتيجة في نظرية اللغات الرسمية تسمح بتحويل أي آلة حالة منتهية غير حتمية (NFA) إلى آلة حالة منتهية حتمية (DFA). يمكن إنشاء آلة الحالة المنتهية الحتمية بشكل صريح، ثم تشغيلها على سلسلة الإدخال الناتجة رمزًا رمزًا. يستغرق إنشاء آلة الحالة المنتهية الحتمية لتعبير نمطي بحجم m وقتًا وذاكرة من رتبة O (2^ m )، ولكن يمكن تشغيلها على سلسلة بحجم n في زمن O ( n ). تجدر الإشارة إلى أن حجم التعبير هو الحجم بعد توسيع الاختصارات، مثل المحددات الكمية العددية.

يتمثل أحد الأساليب البديلة في محاكاة الأوتوماتا غير القطعية (NFA) مباشرةً، وذلك ببناء كل حالة من حالات الأوتوماتا القطعية (DFA) عند الطلب ثم التخلص منها في الخطوة التالية. يحافظ هذا الأسلوب على الأوتوماتا القطعية ضمنيًا ويتجنب التكلفة الأسية للبناء، لكن تكلفة التشغيل ترتفع إلى O ( mn ). يُطلق على الأسلوب الصريح اسم خوارزمية الأوتوماتا القطعية، بينما يُطلق على الأسلوب الضمني اسم خوارزمية الأوتوماتا غير القطعية. غالبًا ما تُسمى إضافة التخزين المؤقت إلى خوارزمية الأوتوماتا غير القطعية بخوارزمية "الأوتوماتا القطعية الكسولة"، أو ببساطة خوارزمية الأوتوماتا القطعية دون تمييز. تتميز هذه الخوارزميات بالسرعة، لكن استخدامها لاسترجاع التعبيرات الفرعية المجمعة، والقياس الكمي الكسول، والميزات المشابهة يُعد أمرًا معقدًا. [ 50 ] [ 51 ] تتضمن التطبيقات الحديثة عائلة re1- re2 -sregex المستندة إلى كود كوكس.

تعتمد الخوارزمية الثالثة على مطابقة النمط مع سلسلة الإدخال باستخدام التراجع . تُعرف هذه الخوارزمية عادةً باسم NFA، ولكن هذا المصطلح قد يكون مُربكًا. قد يكون وقت تشغيلها أُسّيًا، وهو ما يظهر في التطبيقات البسيطة عند المطابقة مع تعابير تحتوي على كلٍ من التناوب والكمية غير المحدودة، مما يُجبر الخوارزمية على النظر في عدد متزايد أُسّيًا من الحالات الفرعية. قد يُسبب هذا السلوك مشكلة أمنية تُعرف باسم هجوم حجب الخدمة باستخدام التعابير النمطية (ReDoS).(a|aa)*b

على الرغم من أن تطبيقات التراجع لا توفر سوى ضمان أسي في أسوأ الحالات، إلا أنها توفر مرونة وقدرة تعبيرية أكبر بكثير. على سبيل المثال، أي تطبيق يسمح باستخدام المراجع الخلفية، أو يُنفذ الإضافات المختلفة التي قدمتها لغة بيرل، يجب أن يتضمن نوعًا من التراجع. تحاول بعض التطبيقات الجمع بين أفضل ما في الخوارزميتين من خلال تشغيل خوارزمية DFA سريعة أولًا، ثم اللجوء إلى خوارزمية تراجع أبطأ عند مصادفة مرجع خلفي أثناء المطابقة. يستخدم برنامج GNU grep (وخوارزمية gnulib DFA الأساسية) هذه الاستراتيجية. [ 52 ]

تم تحقيق خوارزميات ذات زمن تشغيل شبه خطي باستخدام خوارزميات تعتمد على بوير-مور (BM) وتقنيات تحسين DFA ذات الصلة، مثل المسح العكسي. [ 53 ] يستخدم GNU grep، الذي يدعم مجموعة واسعة من صيغ POSIX وامتداداتها، خوارزمية بوير-مور (BM) للتصفية المسبقة في المرحلة الأولى، ثم يستخدم DFA ضمنيًا. أما Wu agrep ، الذي يُنفذ المطابقة التقريبية، فيجمع التصفية المسبقة في DFA باستخدام BDM (مطابقة DAWG العكسية). ويُوسّع BNDM الخاص بـ NR-grep تقنية BDM باستخدام التوازي على مستوى البتات Shift-Or. [ 54 ]

توجد بعض البدائل النظرية للتراجع في المراجع الخلفية، وتكون "أسسها" أقل تعقيدًا لأنها مرتبطة فقط بعدد المراجع الخلفية، وهي خاصية ثابتة في بعض لغات التعبير النمطي مثل POSIX. إحدى الطرق البسيطة التي تُكرر آلة الحالة المحدودة غير المتراجعة لكل ملاحظة مرجع خلفي لها تعقيد منيا(ن2ك+2){\displaystyle {\mathrm {O} }(n^{2k+2})}الوقت ويا(ن2ك+1){\displaystyle {\mathrm {O} }(n^{2k+1})}مساحة لكومة قش بطول n و k مرجعًا خلفيًا في التعبير النمطي. [ 55 ] يقدم العمل النظري القائم على أتمتة الذاكرة حدًا أدق بناءً على عقد المتغيرات "النشطة" المستخدمة، وإمكانية متعددة الحدود لبعض التعبيرات النمطية ذات المراجع الخلفية. [ 56 ]

يونيكود

نظريًا، يمكن مطابقة أي مجموعة رموز باستخدام التعابير النمطية طالما أنها مُعرَّفة مسبقًا. أما من الناحية التطبيقية، فقد كُتبت التعابير النمطية في الأصل لاستخدام أحرف ASCII كمجموعة رموز، مع أن مكتبات التعابير النمطية تدعم العديد من مجموعات الأحرف الأخرى . توفر العديد من محركات التعابير النمطية الحديثة دعمًا جزئيًا على الأقل لـ Unicode . في معظم الحالات، لا يهم نوع مجموعة الأحرف، ولكن قد تظهر بعض المشكلات عند توسيع التعابير النمطية لدعم Unicode.

  • الترميز المدعوم . تتوقع بعض مكتبات التعبيرات النمطية العمل على ترميز معين بدلاً من أحرف يونيكود المجردة. يتطلب العديد منها ترميز UTF-8 ، بينما قد يتوقع البعض الآخر UTF-16 أو UTF-32 . في المقابل، لا يتقيد كل من بيرل وجافا بترميز معين، بل يعملان داخليًا على الأحرف التي تم فك ترميزها.
  • نطاق يونيكود المدعوم . تدعم العديد من محركات التعبيرات النمطية المستوى الأساسي متعدد اللغات فقط ، أي الأحرف التي يمكن ترميزها باستخدام 16 بت فقط. حاليًا (اعتبارًا من عام 2016)) عدد قليل فقط من محركات التعبيرات النمطية (مثل محركات Perl و Java) يمكنها التعامل مع نطاق Unicode الكامل المكون من 21 بت.
  • توسيع نطاقات الأحرف الموجهة نحو ASCII لتشمل Unicode . على سبيل المثال، في تطبيقات ASCII، [x-y]تكون نطاقات الأحرف من الشكل صالحةً عندما يكون للحرفين x و y نقاط ترميز في النطاق [0x00,0x7F] ويكون رمز النقطة x ≤ رمز النقطة y . ويتمثل التوسيع الطبيعي لهذه النطاقات إلى Unicode في تغيير شرط أن تكون نقاط النهاية في النطاق [0x00,0x7F] إلى شرط أن تكون في النطاق [0x0000,0x10FFFF]. مع ذلك، لا يكون هذا هو الحال في الواقع العملي. فبعض التطبيقات، مثل تطبيق gawk ، لا تسمح بنطاقات الأحرف التي تعبر كتل Unicode. يُعدّ نطاق مثل [0x61,0x7F] صالحًا لأنّ كلا طرفيه يقعان ضمن كتلة الأحرف اللاتينية الأساسية، وكذلك نطاق [0x0530,0x0560] لأنّ كلا طرفيه يقعان ضمن كتلة الأحرف الأرمنية، بينما يُعدّ نطاق مثل [0x0061,0x0532] غير صالح لأنه يشمل كتلًا متعددة من يونيكود. تسمح محركات أخرى، مثل محرك محرر Vim ، بتجاوز الكتل، ولكن يجب ألا يزيد الفرق بين قيم الأحرف عن 256 حرفًا. [ 57 ]
  • عدم حساسية حالة الأحرف . تؤثر بعض علامات عدم حساسية حالة الأحرف على أحرف ASCII فقط، بينما تؤثر علامات أخرى على جميع الأحرف. تحتوي بعض المحركات على علامتين مختلفتين، إحداهما لـ ASCII والأخرى لـ Unicode. كما يختلف تحديد الأحرف التي تنتمي إلى فئات POSIX.
  • تُعدّ خاصية عدم حساسية حالة الأحرف من الخصائص المنطقية في البحث النصي، على غرار خاصية عدم حساسية حالة الأحرف في نظام ASCII. وقد أدخل نظام Unicode أنظمة كتابة أبجدية لا تُراعي حالة الأحرف، مثل ديفاناغاري ، ولذلك لا تنطبق عليها هذه الخاصية. أما بالنسبة لأنظمة الكتابة مثل الصينية، فيبدو التمييز بين الكتابة التقليدية والمبسطة منطقيًا. وفي الكتابة العربية، قد يكون من المرغوب فيه عدم مراعاة موضع الحرف في بداية الكلمة أو وسطها أو نهايتها أو حتى في حالة الأحرف المنفردة . وفي الكتابة اليابانية، قد يكون عدم مراعاة الفرق بين الهيراغانا والكاتاكانا مفيدًا في بعض الأحيان.
  • التوحيد القياسي . يحتوي يونيكود على أحرف مركبة . وكما هو الحال في الآلات الكاتبة القديمة، يمكن أن يتبع الأحرف الأساسية (المسافات البيضاء، وعلامات الترقيم، والرموز، والأرقام، أو الحروف) رمز واحد أو أكثر من الرموز غير الفاصلة (عادةً علامات التشكيل، مثل علامات التشكيل التي تُعدّل الحروف) لتشكيل حرف واحد قابل للطباعة؛ ولكن يوفر يونيكود أيضًا مجموعة محدودة من الأحرف المركبة مسبقًا، أي الأحرف التي تتضمن بالفعل حرفًا مركبًا واحدًا أو أكثر. يجب مطابقة تسلسل الحرف الأساسي + الأحرف المركبة مع الحرف المركب المفرد المطابق (لا يمكن تجميع سوى بعض هذه التسلسلات المركبة مسبقًا في حرف يونيكود واحد، ولكن هناك عدد لا نهائي من التسلسلات المركبة الأخرى الممكنة في يونيكود، وهي ضرورية للغات مختلفة، باستخدام حرف مركب واحد أو أكثر بعد الحرف الأساسي الأولي؛ قد تتضمن هذه التسلسلات المركبة حرفًا أساسيًا أو أحرفًا مركبة مركبة جزئيًا مسبقًا، ولكن ليس بالضرورة بالترتيب المتعارف عليه وليس بالضرورة باستخدام التركيبات المتعارف عليها). تُسمى عملية توحيد تسلسلات الحرف الأساسي + الأحرف المركبة عن طريق تحليل هذه التسلسلات المتكافئة بشكل أساسي ، قبل إعادة ترتيبها في الترتيب الأساسي (وإعادة تركيب بعض الأحرف المركبة في الحرف الأساسي الرائد اختيارياً) بالتطبيع.
  • رموز تحكم جديدة . أدخلت يونيكود، من بين رموز أخرى، علامات ترتيب البايتات وعلامات اتجاه النص. قد يتطلب التعامل مع هذه الرموز طريقة خاصة.
  • تقديم فئات الأحرف لكتل ​​يونيكود، والنصوص، والعديد من خصائص الأحرف الأخرى . خصائص الكتل أقل فائدة بكثير من خصائص النصوص، لأن الكتلة الواحدة قد تحتوي على نقاط ترميز من عدة نصوص مختلفة، والنص الواحد قد يحتوي على نقاط ترميز من عدة كتل مختلفة. [ 58 ] في لغة بيرل ومكتبتها java.util.regex، تطابق الخصائص من الشكل ` \p{InX}x` أو ` y` \p{Block=X}الأحرف في الكتلة X ، بينما تطابق الخصائص من الشكل `x` أو `y` نقاط الترميز غير الموجودة في تلك الكتلة. وبالمثل، ` x` أو `y` أو ` y` تطابق أي حرف في النص الأرمني. بشكل عام، `x` تطابق أي حرف إما بالخاصية الثنائية X أو بالفئة العامة X. على سبيل المثال، `x` أو `y` أو ` y` تطابق أي حرف كبير. تشمل الخصائص الثنائية التي ليست فئات عامة `x` و`y` و`y` و` y`. ومن أمثلة الخصائص غير الثنائية `x` و`y` و` y` .\P{InX}\P{Block=X}\p{Armenian}\p{IsArmenian}\p{Script=Armenian}\p{X}\p{Lu}\p{Uppercase_Letter}\p{GC=Lu}\p{White_Space}\p{Alphabetic}\p{Math}\p{Dash}\p{Bidi_Class=Right_to_Left}\p{Word_Break=A_Letter}\p{Numeric_Value=10}

الدعم اللغوي

تدعم معظم لغات البرمجة ذات الأغراض العامة إمكانيات التعبيرات النمطية، إما بشكل أصلي أو عبر المكتبات .

الاستخدامات

تُعدّ التعابير النمطية مفيدة في مجموعة واسعة من مهام معالجة النصوص، وبشكل أعم في معالجة السلاسل النصية ، حيث لا يشترط أن تكون البيانات نصية. تشمل التطبيقات الشائعة التحقق من صحة البيانات ، واستخراج البيانات (وخاصةً استخراجها من مواقع الويبومعالجة البيانات ، والتحليل البسيط ، وتطوير أنظمة تمييز بناء الجملة ، والعديد من المهام الأخرى.

تتيح بعض برامج النشر المكتبي المتطورة استخدام التعابير النمطية لتطبيق أنماط النصوص تلقائيًا، مما يوفر على مصمم الصفحات عناء القيام بذلك يدويًا لكل ما يمكن مطابقته بواسطة التعبير النمطي. على سبيل المثال، بتحديد نمط أحرف يحوّل النص إلى أحرف صغيرة ، ثم استخدام التعبير النمطي [A-Z]{4,}لتطبيق هذا النمط، سيتم عرض أي كلمة تتكون من أربعة أحرف كبيرة متتالية أو أكثر تلقائيًا بأحرف صغيرة.

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

أمثلة

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

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

تُستخدم الاصطلاحات التالية في الأمثلة. [ 60 ]

الحرف (الأحرف) الخاص؛ يحدد عمود الأحرف الخاصة صيغة التعبير النمطي التي يتم عرضها =~ m// ;; يشير إلى عملية مطابقة التعبيرات النمطية في لغة بيرل =~ s/// ;; يشير إلى عملية استبدال باستخدام التعبيرات النمطية في لغة بيرل

جميع هذه التعابير النمطية تشبه في تركيبها لغة بيرل. أما التعابير النمطية القياسية في نظام POSIX فهي مختلفة.

ما لم يُذكر خلاف ذلك، فإن الأمثلة التالية تتوافق مع لغة برمجة بيرل ، الإصدار 5.8.8، 31 يناير 2006. وهذا يعني أن التطبيقات الأخرى قد تفتقر إلى دعم بعض أجزاء بناء الجملة الموضحة هنا (مثل التعبير النمطي الأساسي مقابل التعبير النمطي الموسع، \( \)أو ()عدم وجود \dبدلاً من POSIX[:digit:] ).

تتطابق القواعد والاصطلاحات المستخدمة في هذه الأمثلة مع تلك المستخدمة في بيئات البرمجة الأخرى أيضًا. [ 61 ]

الحرف ( الحرفيات)وصفمثال [ 62 ]
.عادةً ما يطابق أي حرف باستثناء سطر جديد. داخل الأقواس المربعة، تكون النقطة حرفية.
$string1 = "Hello World\n" ; if ( $string1 =~ m/...../ ) { print "$string1 has length >= 5.\n" ; }

الناتج:

يجب أن يكون طول عبارة "Hello World" أكبر من أو يساوي 5.
( )يُجمّع هذا العنصر سلسلة من عناصر النمط في عنصر واحد. عند مطابقة نمط داخل قوسين، يمكنك استخدام أي من الرموز $1التالية $2لاحقًا للإشارة إلى النمط الذي تمت مطابقته سابقًا. قد تستخدم بعض التطبيقات رمز الشرطة المائلة العكسية بدلًا من ذلك، \1مثل \2.
$string1 = "Hello World\n" ; if ( $string1 =~ m/(H..).(o..)/ ) { print "We matched '$1' and '$2'.\n" ; }

الناتج:

لقد طابقنا كلمتي "Hel" و "o W".
+يطابق عنصر النمط السابق مرة واحدة أو أكثر.
$string1 = "Hello World\n" ; if ( $string1 =~ m/l+/ ) { print "يوجد حرف واحد أو أكثر متتالي "l" في $string1.\n" ; }

الناتج:

يوجد حرف "l" واحد أو أكثر متتالي في عبارة "Hello World".
?يطابق عنصر النمط السابق صفر أو مرة واحدة.
$string1 = "Hello World\n" ; if ( $string1 =~ m/H.?e/ ) { print "يوجد حرف 'H' وحرف 'e' مفصولان بـ " ; print "0-1 حرف (مثلاً، He Hue Hee).\n" ; }

الناتج:

يوجد حرف "H" وحرف "e" مفصولان بـ 0-1 حرف (على سبيل المثال، He Hue Hee).
?يقوم بتعديل التعبير النمطي *, +, ?أو {M,N}'d الذي يأتي قبل ذلك ليطابق أقل عدد ممكن من المرات.
$string1 = "Hello World\n" ; if ( $string1 =~ m/ ( l.+?o)/ ) { print "المطابقة غير الجشعة مع 'l' متبوعة بحرف واحد أو أكثر هي 'llo' بدلاً من 'llo Wo'.\n" ; }

الناتج:

المطابقة غير الجشعة مع الحرف 'l' متبوعًا بحرف واحد أو أكثر هي 'llo' بدلاً من 'llo Wo'.
*يطابق عنصر النمط السابق صفر أو أكثر من المرات.
$string1 = "Hello World\n" ; if ( $string1 =~ m/el*o/ ) { print "يوجد حرف 'e' متبوعًا من صفر إلى عدة أحرف" ; print "حرف 'l' متبوعًا بحرف 'o' (مثل: eo، elo، ello، elllo).\n" ; }

الناتج:

يوجد حرف 'e' متبوعًا من صفر إلى العديد من أحرف 'l' متبوعة بحرف 'o' (على سبيل المثال، eo، elo، ello، elllo).
{M,N}يشير الرمز إلى الحد الأدنى لعدد مرات التطابق M والحد الأقصى لعدد مرات التطابق N. يمكن حذف N ويمكن أن تكون قيمة M صفرًا: {M}يتطابق "بالضبط" M مرة؛ {M,}يتطابق "على الأقل" M مرة؛ {0,N}يتطابق "على الأكثر" N مرة. x* y+ z?وبالتالي، فإن هذا يكافئ x{0,} y{1,} z{0,1}.
$string1 = "Hello World\n" ; if ( $string1 =~ m/l{1,2}/ ) { print "يوجد جزء فرعي يحتوي على حرف l واحد على الأقل" ; print "وحرفين l على الأكثر في $string1\n" ; }

الناتج:

توجد سلسلة فرعية تحتوي على حرف "l" واحد على الأقل وحرفين على الأكثر في عبارة "Hello World".
[…]يشير إلى مجموعة من التطابقات المحتملة للأحرف.
$string1 = "Hello World\n" ; if ( $string1 =~ m/[aeiou]+/ ) { print "$string1 contains one or more vowels.\n" ; }

الناتج:

تحتوي عبارة "Hello World" على حرف علة واحد أو أكثر.
|يفصل بين الاحتمالات البديلة.
$string1 = "Hello World\n" ; if ( $string1 =~ m/(Hello|Hi|Pogo)/ ) { print "$string1 يحتوي على واحد على الأقل من Hello أو Hi أو Pogo." ; }

الناتج:

تحتوي عبارة "Hello World" على واحد على الأقل من الكلمات التالية: Hello أو Hi أو Pogo.
\bيُطابق حدًا بعرض صفري بين حرف من فئة الكلمات (انظر التالي) وحرف من فئة غير الكلمات أو حافة؛ تمامًا مثل

(^\w|\w$|\W\w|\w\W).

$string1 = "Hello World\n" ; if ( $string1 =~ m/llo\b/ ) { print "هناك كلمة تنتهي بـ 'llo'.\n" ; }

الناتج:

هناك كلمة تنتهي بـ "llo".
\wيطابق حرفًا أبجديًا رقميًا، بما في ذلك "_"؛ كما هو الحال [A-Za-z0-9_]في ASCII، و
[\p{Alphabetic}\p{GC=Mark}\p{GC=Decimal_Number}\p{GC=Connector_Punctuation}]

في يونيكود، [ 58 ] حيث Alphabeticتحتوي الخاصية على أكثر من الأحرف اللاتينية، وتحتوي Decimal_Numberالخاصية على أكثر من الأرقام العربية.

$string1 = "Hello World\n" ; if ( $string1 =~ m/\w/ ) { print "يوجد حرف أبجدي رقمي واحد على الأقل" ; print "حرف في $string1 (AZ, az, 0-9, _).\n" ; }

الناتج:

يوجد حرف أبجدي رقمي واحد على الأقل في برنامج Hello World (AZ, az, 0-9, _).
\Wيطابق حرفًا غير أبجدي رقمي، باستثناء "_"؛ كما هو الحال [^A-Za-z0-9_]في ASCII، و
[^\p{Alphabetic}\p{GC=Mark}\p{GC=Decimal_Number}\p{GC=Connector_Punctuation}]

في يونيكود.

$string1 = "Hello World\n" ; if ( $string1 =~ m/\W/ ) { print "المسافة بين Hello و " ; print "World is not alphanumeric.\n" ; }

الناتج:

المسافة بين كلمتي "Hello" و "World" ليست مسافة أبجدية رقمية.
\sيطابق حرف المسافة البيضاء، والتي في ASCII هي علامة الجدولة، وتغذية السطر، وتغذية النموذج، وإرجاع المؤشر، والمسافة؛ في Unicode، يطابق أيضًا المسافات غير القابلة للكسر، والسطر التالي، والمسافات ذات العرض المتغير (من بين أمور أخرى).
$string1 = "Hello World\n" ; if ( $string1 =~ m/\s.*\s/ ) { print "يوجد في $string1 حرفان من المسافات البيضاء، والتي قد" ; print " مفصولان بأحرف أخرى.\n" ; }

الناتج:

في عبارة "Hello World" يوجد حرفان للمسافة البيضاء، ويمكن فصلهما بأحرف أخرى.
\Sيطابق أي شيء ما عدا المسافات البيضاء.
$string1 = "Hello World\n" ; if ( $string1 =~ m/\S.*\S/ ) { print "يحتوي $string1 على حرفين غير مسافة بيضاء، و" ; print " قد يفصل بينهما أحرف أخرى.\n" ; }

الناتج:

في عبارة "Hello World" يوجد حرفان غير مسافات بيضاء، ويمكن فصلهما بأحرف أخرى.
\dيطابق رقمًا؛ نفس الشيء [0-9]في ASCII؛ في Unicode، نفس الخاصية \p{Digit}أو \p{GC=Decimal_Number}، والتي هي نفسها نفس \p{Numeric_Type=Decimal}الخاصية.
$string1 = "99 زجاجة بيرة على الحائط." ; if ( $string1 =~ m/(\d+)/ ) { print "$1 هو الرقم الأول في '$string1'\n" ; }

الناتج:

99 هو الرقم الأول في عبارة "99 زجاجة بيرة على الحائط".
\Dيطابق رمزًا غير رقمي؛ كما هو الحال [^0-9]في ASCII أو \P{Digit}Unicode.
$string1 = "Hello World\n" ; if ( $string1 =~ m/\D/ ) { print "At least one character in $string1" ; print " is not a digit.\n" ; }

الناتج:

حرف واحد على الأقل في عبارة "Hello World" ليس رقماً.
^يطابق بداية سطر أو سلسلة نصية.
$string1 = "Hello World\n" ; if ( $string1 =~ m/^He/ ) { print "$string1 starts with the characters 'He'.\n" ; }

الناتج:

تبدأ عبارة "Hello World" بالحرف "هو".
$يطابق نهاية سطر أو سلسلة نصية.
$string1 = "Hello World\n" ; if ( $string1 =~ m/rld$/ ) { print "$string1 عبارة عن سطر أو سلسلة نصية " ; print "تنتهي بـ 'rld'.\n" ; }

الناتج:

عبارة "Hello World" هي سطر أو سلسلة نصية تنتهي بـ 'rld'.
\Aيطابق بداية سلسلة نصية (ولكن ليس سطرًا داخليًا).
$string1 = "Hello\nWorld\n" ; if ( $string1 =~ m/\AH/ ) { print "$string1 is a string " ; print "that starts with 'H'.\n" ; }

الناتج:

عبارة "Hello World" هي سلسلة نصية تبدأ بالحرف "H".
\zيطابق نهاية سلسلة نصية (ولكن ليس سطرًا داخليًا). [ 63 ]
$string1 = "Hello\nWorld\n" ; if ( $string1 =~ m/d\n\z/ ) { print "$string1 is a string " ; print "that ends with 'd\\n'.\n" ; }

الناتج:

عبارة "Hello World" هي سلسلة نصية تنتهي بـ 'd\n'.
[^…]يطابق كل الأحرف باستثناء تلك الموجودة داخل الأقواس.
$string1 = "Hello World\n" ; if ( $string1 =~ m/[^abc]/ ) { print "$string1 contains a character other than " ; print "a, b, and c.\n" ; }

الناتج:

تحتوي عبارة "Hello World" على حرف آخر غير a و b و c.

تعريفي

يمكن غالبًا إنشاء التعابير النمطية ("المستنتجة" أو "المتعلمة") بناءً على مجموعة من سلاسل الأمثلة. يُعرف هذا باستقراء اللغات المنتظمة ، وهو جزء من مشكلة استقراء القواعد النحوية في نظرية التعلم الحاسوبي . رسميًا، عند إعطاء أمثلة لسلاسل نصية في لغة منتظمة، وربما أيضًا أمثلة لسلاسل نصية ليست في تلك اللغة المنتظمة، يُمكن استنتاج قواعد نحوية لتلك اللغة، أي تعبير نمطي يُولّد تلك اللغة. لا يُمكن استنتاج جميع اللغات المنتظمة بهذه الطريقة (انظر تحديد اللغة في النهاية )، ولكن يُمكن استنتاج العديد منها. على سبيل المثال، يُمكن استخدام مجموعة الأمثلة {1، 10، 100}، ومجموعة الأمثلة المضادة {11، 1001، 101، 0} لاستنتاج التعبير النمطي 1⋅0* (1 متبوعًا بصفر أو أكثر من الأصفار).

انظر أيضاً

ملحوظات

  1. غويفيرتس، جان. "دليل استخدام التعابير النمطية - تعلم كيفية استخدام التعابير النمطية" . Regular-Expressions.info . مؤرشف من الأصل بتاريخ 1 نوفمبر 2016. تم الاطلاع عليه بتاريخ 31 أكتوبر 2016 .
  2. ميتكوف، روسلان (2003). دليل أكسفورد للغويات الحاسوبية . مطبعة جامعة أكسفورد. ص 754. ISBN  978-0-19-927634-9أُرشف من المصدر الأصلي بتاريخ 28 فبراير 2017. تم الاطلاع عليه بتاريخ 25 يوليو 2016 .
  3. لوسون، مارك ف. (17 سبتمبر 2003). الأوتوماتا المحدودة . مطبعة سي آر سي. الصفحات 98-100 . ISBN  978-1-58488-255-8أُرشف من الأصل بتاريخ 27 فبراير 2017. تم الاطلاع عليه بتاريخ 25 يوليو 2016 .
  4. "كيف يعمل محرك التعبيرات النمطية داخليًا" . regular-expressions.info . تم ​​الاطلاع عليه بتاريخ 24 فبراير 2024 .
  5. هيدينغز، أنتوني (11 مارس 2020). "كيف تستخدم التعبيرات النمطية فعليًا؟" . howtogeek.com . تم الاطلاع عليه بتاريخ 24 فبراير 2024 .
  6. كلين 1951 .
  7. ليونغ، هينغ (16 سبتمبر 2010). "اللغات المنتظمة والآلات المحدودة" (ملف PDF) . جامعة ولاية نيو مكسيكو . مؤرشف من الأصل (ملف PDF) في 5 ديسمبر 2013. تم الاطلاع عليه في 13 أغسطس 2019. قدم كلين مفهوم الأحداث المنتظمة من خلال تعريف التعبيرات المنتظمة .
  8. كلين 1951، صفحة 46
  9. 1 2 طومسون 1968 .
  10. 1 2 جونسون وآخرون 1968 .
  11. كيرنيغان، برايان (8 أغسطس 2007). "مطابق التعابير النمطية" . الكود الجميل . أورايلي ميديا . الصفحات 1-2 . ISBN  978-0-596-51004-6أُرشف من المصدر الأصلي بتاريخ 7 أكتوبر 2020. تم الاطلاع عليه بتاريخ 15 مايو 2013 .
  12. ريتشي، دينيس م. "تاريخ غير مكتمل لمحرر النصوص QED" . مؤرشف من الأصل في 21 فبراير 1999. تم الاطلاع عليه في 9 أكتوبر 2013 .
  13. 1 2 Aho & Ullman 1992 ، 10.11 ملاحظات ببليوغرافية للفصل 10 ، ص 589.
  14. أيكوك 2003 ، ص 98.
  15. ريموند، إريك س. نقلاً عن دينيس ريتشي (2003). "ملف المصطلحات 4.4.7: grep" . مؤرشف من الأصل بتاريخ 2011-06-05 . تم الاطلاع عليه بتاريخ 2009-02-17 .
  16. "ميزات التعبيرات النمطية الجديدة في Tcl 8.1" . مؤرشف من الأصل بتاريخ 2020-10-07 . تم الاطلاع عليه بتاريخ 2013-10-11 .
  17. "الوثائق: 9.3: مطابقة الأنماط" . PostgreSQL . مؤرشف من الأصل بتاريخ 2020-10-07 . تم الاطلاع عليه بتاريخ 2013-10-12 .
  18. وول، لاري (2006). "التعابير النمطية في بيرل" . perlre . مؤرشف من الأصل بتاريخ 31-12-2009 . تم الاطلاع عليه بتاريخ 10-10-2006 .
  19. 1 2 الجدار (2002)
  20. "PCRE - التعبيرات النمطية المتوافقة مع بيرل" . www.pcre.org . تم الاطلاع عليه بتاريخ 7 أبريل 2024 .
  21. "GRegex - تحليلات أسرع لبيانات النصوص غير المهيكلة" . grovf.com . مؤرشف من الأصل بتاريخ 2020-10-07 . تم الاطلاع عليه بتاريخ 2026-04-20 .
  22. "CUDA grep" . bkase.github.io . مؤرشف من الأصل بتاريخ 2020-10-07 . تم الاطلاع عليه بتاريخ 2019-10-22 .
  23. 1 2 3 4 كيريسك، مايكل. "grep(1) - صفحة دليل لينكس" . man7.org . تم الاطلاع عليه بتاريخ 31 يناير 2023 .
  24. 1 2 هوبكروفت، موتواني وأولمان (2000)
  25. سيبر (1998)
  26. ^ جيلاد ونيفين (2008 ، ص. 332، Thm.4.1) 
  27. غروبر وهولزر (2008)
  28. استنادًا إلى Gelade & Neven (2008) ، يمكن العثور علىتعبير منتظم بطول حوالي 850 بحيث يكون طول مكمله حوالي 232 في الملف:RegexComplementBlowup.png .
  29. "التعبيرات النمطية لتحديد قابلية القسمة" . s3.boskent.com . تم الاطلاع عليه بتاريخ 21-02-2024 .
  30. جيشر، جاي إل. (1984). (العنوان غير معروف) (تقرير فني). جامعة ستانفورد، قسم علوم الحاسوب.
  31. هوبكروفت، جون إي.؛ موتاني، راجيف؛ وأولمان، جيفري د. (2003). مقدمة في نظرية الأوتوماتا واللغات والحوسبة . أبر سادل ريفر، نيو جيرسي: أديسون ويسلي. ص 117-120 . ISBN  978-0-201-44124-6. لا يشترط أن تنطبق هذه الخاصية على التعبيرات النمطية الموسعة، حتى لو لم تصف فئة أكبر من اللغات النمطية؛ انظر الصفحة 121.
  32. كوزين (1991)
  33. ريدكو، ف. ن. (1964). "حول تعريف العلاقات لجبر الأحداث المنتظمة" . المجلة الرياضية الأوكرانية (باللغة الروسية). 16 (1): 120-126 . مؤرشف من الأصل بتاريخ 29-03-2018 . تم الاطلاع عليه بتاريخ 28-03-2018 .
  34. ISO/IEC 9945-2:1993 تكنولوجيا المعلومات - واجهة نظام التشغيل المحمولة (POSIX) - الجزء 2: واجهة سطر الأوامر والأدوات المساعدة ، والتي نُقحت لاحقًا لتصبح ISO/IEC 9945-2:2002 تكنولوجيا المعلومات - واجهة نظام التشغيل المحمولة (POSIX) - الجزء 2: واجهات النظام ، وISO/IEC 9945-2:2003، وهي حاليًا ISO/IEC/IEEE 9945:2009 تكنولوجيا المعلومات - المواصفات الأساسية لواجهة نظام التشغيل المحمولة (POSIX)، الإصدار 7
  35. مواصفات يونكس الموحدة (الإصدار 2)
  36. "9.3.6 مطابقة الأحرف المتعددة في قواعد البيانات الأساسية" . مواصفات المجموعة المفتوحة الأساسية، الإصدار 7، طبعة 2018. المجموعة المفتوحة. 2017. تم الاطلاع عليه في 10 ديسمبر 2023 .
  37. روس كوكس (2009). "مطابقة التعبيرات النمطية: منهج الآلة الافتراضية" . swtch.com . ملاحظة جانبية: مطابقة POSIX الفرعية
  38. "توثيق التعبيرات النمطية في لغة بيرل" . perldoc.perl.org. مؤرشف من الأصل في 31 ديسمبر 2009. تم الاطلاع عليه في 5 نوفمبر 2024 .
  39. 1 2 "صيغة التعبير النمطي" . وثائق بايثون 3.5.0 . مؤسسة برمجيات بايثون . مؤرشف من الأصل في 18 يوليو 2018. تم الاطلاع عليه في 10 أكتوبر 2015 .
  40. SRE: التجميع الذري (?>...) غير مدعوم #34627
  41. 1 2 "الفئات الأساسية: التعابير النمطية: المحددات الكمية: الفروق بين المحددات الكمية الجشعة، والمترددة، والملكية" . دروس جافا . أوراكل . مؤرشف من الأصل في 7 أكتوبر 2020. تم الاطلاع عليه في 23 ديسمبر 2016 .
  42. "التجميع الذري" . درس تعليمي حول التعبيرات النمطية . مؤرشف من الأصل في 7 أكتوبر 2020. تم الاطلاع عليه في 24 نوفمبر 2019 .
  43. بورمان، كارستن؛ براي، تيم. I-Regexp: تنسيق تعبير نمطي قابل للتشغيل البيني . فريق عمل هندسة الإنترنت. doi : 10.17487/RFC9485 . RFC 9485. تاريخ الاسترجاع: 11 مارس 2024 .
  44. سيزار كامبيانو؛ كاي سالوما وشينغ يو (ديسمبر 2003). "دراسة رسمية للتعبيرات النمطية العملية" . المجلة الدولية لأسس علوم الحاسوب . 14 (6): 1007-1018 . doi : 10.1142/S012905410300214X . مؤرشف من الأصل في 4 يوليو 2015. تم الاطلاع عليه في 3 يوليو 2015 .النظرية 3 (ص 9)
  45. "مطابقة التعبيرات النمطية في بيرل مسألة صعبة من نوع NP" . perl.plover.com . مؤرشف من الأصل بتاريخ 7 أكتوبر 2020. تم الاطلاع عليه بتاريخ 21 نوفمبر 2019 .
  46. ريتشي، د.م.؛ طومسون، ك.ل. (يونيو 1970). محرر نصوص QED (ملف PDF) . MM-70-1373-3. مؤرشف من الأصل (ملف PDF) بتاريخ 3 فبراير 2015. تم الاطلاع عليه بتاريخ 5 سبتمبر 2022 .تمت إعادة طباعتها بعنوان "دليل مرجعي لمحرر النصوص QED"، MHCC-004، موراي هيل للحوسبة، مختبرات بيل (أكتوبر 1972).
  47. 1 2 وول، لاري (18-10-1994). "Perl 5: perlre.pod" . GitHub .
  48. المنطق المتجول. "كيفية محاكاة عمليات التطلع إلى الأمام والنظر إلى الخلف في آلات الحالة المحدودة؟" . موقع تبادل معلومات علوم الحاسوب . مؤرشف من الأصل في 7 أكتوبر 2020. تم الاطلاع عليه في 24 نوفمبر 2019 .
  49. زاخاريفيتش، إيليا (1997-11-19). "تطبيق تصحيح التعبير النمطي الضخم (مع تعديلات طفيفة): Perl/perl5@c277df4" . جيت هاب .
  50. كوكس (2007)
  51. لوريكاري (2009)
  52. "gnulib/lib/dfa.c" . مؤرشف من الأصل بتاريخ 18 أغسطس 2021. تم الاطلاع عليه بتاريخ 12 فبراير 2022. إذا اكتشف الماسح الضوئي انتقالًا في المرجع الخلفي، فإنه يُرجع نوعًا من "النجاح الجزئي" مما يشير إلى أنه يجب التحقق من التطابق باستخدام مُطابق التراجع.
  53. كيرنز، ستيفن (أغسطس 2013). "المطابقة شبه الخطية مع الأوتوماتا المحدودة باستخدام مسح اللاحقة العكسي". arXiv : 1308.3822 [ cs.DS ].
  54. نافارو، غونزالو (10 نوفمبر 2001). "NR-grep: أداة سريعة ومرنة لمطابقة الأنماط" (ملف PDF) . البرمجيات: الممارسة والخبرة . 31 (13): 1265-1312 . doi : 10.1002/spe.411 . S2CID 3175806. مؤرشف (ملف PDF) من الأصل في 7 أكتوبر 2020. تم الاطلاع عليه في 21 نوفمبر 2019 . 
  55. "travisdowns/polyregex" . GitHub . 5 يوليو 2019. مؤرشف من الأصل في 14 سبتمبر 2020. تم الاطلاع عليه في 21 نوفمبر 2019 .
  56. شميد، ماركوس ل. (مارس 2019). "التعبيرات النمطية مع المراجع الخلفية: تقنيات المطابقة في وقت متعدد الحدود". arXiv : 1903.05896 [ cs.FL ].
  57. "توثيق Vim: النمط" . Vimdoc.sourceforge.net. مؤرشف من الأصل بتاريخ 2020-10-07 . تم الاطلاع عليه بتاريخ 2013-09-25 .
  58. 1 2 "UTS#18 بشأن التعبيرات النمطية في يونيكود، الملحق أ: كتل الأحرف" . مؤرشف من الأصل بتاريخ 2020-10-07 . تم الاطلاع عليه بتاريخ 2010-02-05 .
  59. هورويتز، برادلي (24 أكتوبر 2011). "اكتساح الخريف" . مدونة جوجل . مؤرشف من الأصل في 21 أكتوبر 2018. تم الاطلاع عليه في 4 مايو 2019 .
  60. ليس الحرف 'm' مطلوبًا دائمًا لتحديد عملية مطابقة في لغة بيرل . على سبيل المثال،m/[^abc]/يمكن أيضًا عرضها كـ/[^abc]/. يُستخدم الحرف 'm' فقط إذا رغب المستخدم في تحديد عملية مطابقة دون استخدام الشرطة المائلة كفاصل للتعبير النمطي . في بعض الأحيان، يكون من المفيد تحديد فاصل تعبير نمطي بديل لتجنب " تضارب الفواصل ". راجع " perldoc perlre" ( مؤرشف بتاريخ 31-12-2009 في Wayback Machine ) لمزيد من التفاصيل.
  61. على سبيل المثال، انظر Java in a Nutshell ، ص 213؛ Python Scripting for Computational Science ، ص 320؛ Programming PHP ، ص 106.
  62. جميع عبارات if تُرجع قيمة TRUE
  63. كونواي، داميان (2005). "التعابير النمطية، نهاية السلسلة" . أفضل ممارسات بيرل . أورايلي . ص 240. ISBN  978-0-596-00173-5أُرشف من المصدر الأصلي بتاريخ 7 أكتوبر 2020. تم الاطلاع عليه بتاريخ 10 سبتمبر 2017 .

مراجع