تعبير منتظم

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

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

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

تُستخدم التعبيرات العادية في محركات البحث ، وفي مربعات حوار البحث والاستبدال في معالجات الكلمات ومحرري النصوص ، وفي أدوات معالجة النصوص مثل 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

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

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

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

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

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

أنماط

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

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

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

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

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

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

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

توفر معظم الصيغة العمليات التالية لإنشاء التعبيرات العادية.

قيمة منطقية "أو"
يفصل الشريط العمودي بين البدائل. على سبيل المثال، يمكن أن يتطابق مع "رمادي" أو "رمادي".gray|grey
التجميع
تُستخدم الأقواس لتحديد نطاق وأولوية المشغلات ( من بين استخدامات أخرى). على سبيل المثال، gray|greyو هي أنماط متكافئة تصف مجموعة "الرمادي" أو "الرمادي".gr(a|e)y
القياس الكمي
يحدد المحدد الكمي بعد عنصر (مثل الرمز أو الحرف أو المجموعة) عدد المرات التي يُسمح فيها بتكرار العنصر السابق. المحددات الكمية الأكثر شيوعًا هي علامة الاستفهام ? والنجمة (المشتقة من نجمة كليين ) وعلامة الجمع ( Kleene plus ) .* +
? تشير علامة الاستفهام إلى عدم وجود أي تكرار للعنصر السابق أو تكرار واحدcolou?r له. على سبيل المثال، تتطابق مع كل من "color" و"colour".
* تشير علامة النجمة إلى عدم وجود أي تكرارات للعنصر السابق أو أكثرab*c . على سبيل المثال، التطابقات "ac"، و"abc"، و"abbc"، و"abbbc"، وما إلى ذلك.
+ تشير علامة الجمع إلى تكرار واحد أو أكثر للعنصر السابق. على سبيل المثال، ab+cتتطابق مع "abc"، و"abbc"، و"abbbc"، وما إلى ذلك، ولكن لا تتطابق مع "ac".
{n}[23] تم مطابقة العنصر السابق بالضبط n مرة.
{min,}[23] تم مطابقة العنصر السابق مرات قليلة أو أكثر.
{,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 وS. على سبيل المثال، إذا وصف R {"ab", "c"} ووصف S {"ab", "d", "ef"}، فإن التعبير (R|S)يصف {"ab", "c", "d", "ef"}.
  • ( نجم كلين ) (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 k التي تتكون من جميع السلاسل على الأبجدية { a , b } التي يساوي الحرف k من آخر حرف فيها  a . من ناحية أخرى، يتم إعطاء التعبير العادي الذي يصف L 4 بواسطة .

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

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

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

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

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

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

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

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

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

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

بناء الجملة

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

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

الفواصل

عند إدخال تعبير عادي في لغة برمجة، قد يتم تمثيله كحرف سلسلة عادي، وبالتالي عادة ما يتم اقتباسه؛ هذا شائع في C وJava وPython على سبيل المثال، حيث reيتم إدخال التعبير العادي كـ "re". ومع ذلك، غالبًا ما يتم كتابتها بخطوط مائلة كفاصلات ، كما في /re/بالنسبة إلى التعبير العادي re. نشأ هذا في ed ، حيث /هو أمر المحرر للبحث، ويمكن استخدام تعبير /re/لتحديد نطاق من الأسطر (مطابقة للنمط)، والذي يمكن دمجه مع أوامر أخرى على أي من الجانبين، وأشهرها g/re/pفي grep ("طباعة التعبير العادي العالمي")، والذي يتم تضمينه في معظم أنظمة التشغيل المستندة إلى Unix ، مثل توزيعات Linux . يتم استخدام اتفاقية مماثلة في sed ، حيث يتم إعطاء البحث والاستبدال بواسطة s/re/replacement/ويمكن ربط الأنماط بفاصلة لتحديد نطاق من الأسطر كما في /re1/,/re2/. هذا الترميز معروف بشكل خاص بسبب استخدامه في Perl ، حيث يشكل جزءًا من بناء الجملة المميز عن الحروف العادية للسلسلة. في بعض الحالات، مثل sed وPerl، يمكن استخدام فواصل بديلة لتجنب الاصطدام بالمحتويات، وتجنب الاضطرار إلى تجنب تكرار ظهور حرف الفاصل في المحتويات. على سبيل المثال، في sed، s,/,X,سيستبدل الأمر a /بـ 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 grep على الخيارات التالية: " grep -E" لـ ERE، و" grep -G" لـ BRE (الخيار الافتراضي)، و" grep -P" للتعبيرات العادية في Perl .

أصبحت التعبيرات العادية في لغة Perl معيارًا فعليًا، حيث تحتوي على مجموعة غنية وقوية من التعبيرات الذرية. لا تحتوي لغة Perl على مستويات "أساسية" أو "ممتدة". كما هو الحال في EREs 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 ). باستخدام هذا البناء النحوي، يتسبب استخدام الشرطة المائلة العكسية في معاملة الحرف الوصفي كحرف حرفي. على سبيل المثال، \( \)is now ( )و \{ \}is now { }. بالإضافة إلى ذلك، تتم إزالة الدعم للمراجع الخلفية وإضافة الأحرف الوصفية التالية: \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]يمكن أن يرمز إلى أي حرف كبير في الأبجدية الإنجليزية، ويمكن أن يعني أي رقم. تنطبق فئات الأحرف على مستويي POSIX. \d

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

وصف بوسيكس بيرل/تي سي ال همة جافا أسكي
أحرف 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:]، والتي يتم تعريفها عادةً على أنها [:alnum:]علامة زائد أسفل السطر. وهذا يعكس حقيقة مفادها أنه في العديد من لغات البرمجة، هذه هي الأحرف التي يمكن استخدامها في المعرفات. يميز محرر Vim أيضًا بين فئات الكلمات ورؤوس الكلمات (باستخدام الترميز و ) نظرًا لأن الأحرف التي يمكن أن تبدأ معرفًا في العديد من لغات البرمجة ليست هي نفسها تلك التي يمكن أن تظهر في مواضع أخرى: يتم استبعاد الأرقام بشكل عام، لذلك سيبدو المعرف مثل أو في ترميز POSIX. \w\h\h\w*[[:alpha:]_][[:alnum:]_]*

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

بيرل و PCRE

نظرًا لقوتها التعبيرية وسهولة قراءتها (النسبية)، فقد تبنت العديد من الأدوات المساعدة ولغات البرمجة الأخرى قواعد نحوية مشابهة لتلك الخاصة بلغة بيرل - على سبيل المثال، جافا ، جافا سكريبت ، جوليا ، بايثون ، روبي ، كيو تي ، مايكروسوفت. NET Framework ، و XML Schema . تدعم بعض اللغات والأدوات مثل Boost و PHP نكهات متعددة من التعبيرات العادية. لا تتطابق تطبيقات التعبيرات العادية المشتقة من بيرل وعادةً ما تنفذ مجموعة فرعية من الميزات الموجودة في بيرل 5.0، التي صدرت في عام 1994. تتضمن بيرل أحيانًا ميزات موجودة في البداية في لغات أخرى. على سبيل المثال، تنفذ بيرل 5.10 امتدادات نحوية تم تطويرها في الأصل في PCRE وPython. [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]

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

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

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

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

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

تأكيدات

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

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

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

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

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

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

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

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

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

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

توجد بعض البدائل النظرية للتتبع العكسي للمراجع العكسية، و"أسسها" أكثر هدوءًا لأنها مرتبطة فقط بعدد المراجع العكسية، وهي خاصية ثابتة لبعض لغات التعبيرات العادية مثل POSIX. إحدى الطرق الساذجة التي تكرر NFA غير التتبع العكسي لكل ملاحظة مرجعية عكسية لها تعقيد ⁠ وقتمساحة لكومة قش بطول n و k مراجع عكسية في التعبير العادي. [55] يعطي عمل نظري حديث جدًا يعتمد على أتمتة الذاكرة حدًا أضيق بناءً على عقد المتغيرات "النشطة" المستخدمة، وإمكانية متعددة الحدود لبعض التعبيرات العادية ذات المرجع العكسي. [56]

يونيكود

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

  • الترميز المدعوم . تتوقع بعض مكتبات التعبيرات العادية العمل على بعض الترميز المعين بدلاً من الأحرف المجردة من Unicode. يتطلب العديد منها ترميز UTF-8 ، بينما قد يتوقع البعض الآخر ترميز UTF-16 أو UTF-32 . على النقيض من ذلك، لا تعتمد Perl وJava على الترميزات، بل تعمل بدلاً من ذلك على الأحرف المفكوكة داخليًا.
  • نطاق Unicode المدعوم . تدعم العديد من محركات التعبيرات العادية المستوى متعدد اللغات الأساسي فقط ، أي الأحرف التي يمكن ترميزها بـ 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 نصوصًا أبجدية بدون حالة الأحرف مثل Devanagari . بالنسبة لهذه النصوص، لا تنطبق حساسية الحالة . بالنسبة للنصوص مثل الصينية، يبدو أن هناك تمييزًا آخر منطقيًا: بين التقليدية والمبسطة. في النصوص العربية، قد تكون عدم الحساسية للموضع الأولي والوسيط والنهائي والمعزول مرغوبة. في اللغة اليابانية، يكون عدم الحساسية بين الهيراجانا والكاتاكانا مفيدًا في بعض الأحيان.
  • التطبيع . يحتوي Unicode على أحرف تجميعية . مثل الآلات الكاتبة القديمة، يمكن أن تتبع الأحرف الأساسية البسيطة (المسافات البيضاء، وعلامات الترقيم، والرموز، والأرقام، أو الحروف) رمز واحد أو أكثر بدون تباعد (عادةً علامات التشكيل، مثل علامات التشكيل التي تعدل الحروف) لتشكيل حرف واحد قابل للطباعة؛ ولكن يوفر Unicode أيضًا مجموعة محدودة من الأحرف المركبة مسبقًا، أي الأحرف التي تتضمن بالفعل حرفًا مركبًا واحدًا أو أكثر. يجب مطابقة تسلسل من حرف أساسي + أحرف مجمعة مع الحرف المركب مسبقًا المتطابق (يمكن فقط تجميع بعض تسلسلات التجميع هذه مسبقًا في حرف Unicode واحد، ولكن هناك عدد لا نهائي من تسلسلات التجميع الأخرى الممكنة في Unicode، وهي مطلوبة للغات مختلفة، باستخدام حرف مركب واحد أو أكثر بعد حرف أساسي أولي؛ قد تتضمن تسلسلات التجميع هذه حرفًا أساسيًا أو أحرف مجمعة مركبة مسبقًا جزئيًا، ولكن ليس بالضرورة بالترتيب الأساسي وليس بالضرورة باستخدام التراكيب الأساسية المسبقة). تسمى عملية توحيد تسلسلات حرف أساسي + دمج الأحرف عن طريق تحليل هذه التسلسلات المكافئة قانونيًا ، قبل إعادة ترتيبها إلى ترتيب قانوني (وإعادة تكوين بعض الأحرف المدمجة اختياريًا في الحرف الأساسي الرائد) بالتطبيع.
  • رموز تحكم جديدة . تم تقديم Unicode من بين أمور أخرى، علامات ترتيب البايتات وعلامات اتجاه النص. قد يتعين التعامل مع هذه الرموز بطريقة خاصة.
  • مقدمة لفئات الأحرف لكتل ​​Unicode والبرامج النصية والعديد من خصائص الأحرف الأخرى . خصائص الكتلة أقل فائدة بكثير من خصائص النص، لأن الكتلة يمكن أن تحتوي على نقاط رمز من عدة برامج نصية مختلفة، ويمكن أن يحتوي النص على نقاط رمز من عدة كتل مختلفة. [58] في Perl والمكتبة java.util.regex، خصائص النموذج \p{InX}أو \p{Block=X}تطابق الأحرف في الكتلة X و \P{InX}أو \P{Block=X}تطابق نقاط الرمز غير الموجودة في تلك الكتلة. وبالمثل، \p{Armenian}, \p{IsArmenian}, أو \p{Script=Armenian}تطابق أي حرف في النص الأرمني. بشكل عام، \p{X}تطابق أي حرف مع الخاصية الثنائية X أو الفئة العامة 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,}لتطبيق هذا النمط، سيتم عرض أي كلمة مكونة من أربعة أحرف كبيرة متتالية أو أكثر تلقائيًا بأحرف صغيرة بدلاً من ذلك.

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

أمثلة

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

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

يتم استخدام الاتفاقيات التالية في الأمثلة. [70]

metacharacter(s) ;; يحدد عمود metacharacters بناء جملة regex الذي يتم عرضه
=~ m// ;; يشير إلى عملية مطابقة تعبير عادي في Perl
=~ s/// ;; يشير إلى عملية استبدال تعبير عادي في Perl

ومن الجدير بالذكر أيضًا أن هذه التعبيرات العادية كلها تشبه قواعد بناء الجملة في لغة Perl. أما التعبيرات العادية القياسية في POSIX فهي مختلفة.

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

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

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

الإخراج:


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

الإخراج:

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

الإخراج:

هناك حرف "l" واحد أو أكثر متتاليًا في Hello World.
? يتطابق مع عنصر النمط السابق صفرًا أو مرة واحدة.
$string1 = "مرحبا بالعالم\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' متبوعة بواحد أو " ; print "المزيد من الأحرف هي 'llo' بدلاً من 'llo Wo'.\n" ; }  
    
   
   

الإخراج:

المطابقة غير الجشعة مع 'l' متبوعة بحرف واحد أو أكثر هي 'llo' وليس 'llo Wo'.
* يتطابق مع عنصر النمط السابق صفر مرة أو أكثر.
$string1 = "مرحبا بالعالم\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 0: {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 "يوجد سلسلة فرعية تحتوي على 1 على الأقل " ; print "و2 l على الأكثر في $string1\n" ; }  
    
   
   

الإخراج:

يوجد سلسلة فرعية تحتوي على 1 على الأقل و2 على الأكثر في Hello World
[…] يشير إلى مجموعة من تطابقات الأحرف المحتملة.
$string1 = "مرحبا بالعالم\n" ; if ( $string1 =~ m/[aeiou]+/ ) { print "$string1 يحتوي على حرف علة واحد أو أكثر.\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}]

في Unicode، [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 "العالم ليس أبجديًا رقميًا.\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 "يوجد حرف واحد على الأقل في $string1" ; print "هذا ليس رقمًا.\n" ; }  
    
   
   

الإخراج:

يوجد على الأقل حرف واحد في Hello World 
ليس رقمًا.
^ يتطابق مع بداية السطر أو السلسلة.
$string1 = "Hello World\n" ; if ( $string1 =~ m/^He/ ) { print "$string1 يبدأ بالأحرف '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 عبارة عن سلسلة " ; print "تبدأ بـ 'H'.\n" ; }  
    
   
   

الإخراج:

مرحبا 
بالعالم 
هي سلسلة تبدأ بحرف 'H'.
\z يتطابق مع نهاية السلسلة (ولكن ليس سطرًا داخليًا). [73]
$string1 = "Hello\nWorld\n" ; if ( $string1 =~ m/d\n\z/ ) { print "$string1 عبارة عن سلسلة " ; print "تنتهي بـ 'd\\n'.\n" ; }  
    
   
   

الإخراج:

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

الإخراج:

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

تعريفي

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

انظر أيضا

ملحوظات

  1. ^ Goyvaerts, Jan. "Regular Expression Tutorial - Learn How to Use Regular Expressions". Regular-Expressions.info . مؤرشف من الأصل في 2016-11-01 . تم الاسترجاع في 2016-10-31 .
  2. ^ ميتكوف، رسلان (2003). دليل أكسفورد للغويات الحاسوبية. مطبعة جامعة أكسفورد. ص 754. ISBN 978-0-19-927634-9. تم أرشفة النسخة الأصلية في 2017-02-28 . تم استرجاعها في 2016-07-25 .
  3. ^ لوسون، مارك ف. (17 سبتمبر 2003). Finite Automata. CRC Press. ص 98-100. ISBN 978-1-58488-255-8. مؤرشف من الأصل في 27 فبراير 2017 . اطلع عليه بتاريخ 25 يوليو 2016 .
  4. ^ "كيف يعمل محرك التعبيرات العادية داخليًا". regular-expressions.info . تم الاسترجاع في 24 فبراير 2024 .
  5. ^ "كيف تستخدم Regex فعليًا؟". howtogeek.com . 11 مارس 2020 . تم الاسترجاع في 24 فبراير 2024 .
  6. ^ كليين 1951.
  7. ^ Leung, Hing (16 September 2010). "Regular Languages ​​and Finite Automata" (PDF) . جامعة ولاية نيو مكسيكو . مؤرشف من الأصل (PDF) في 5 ديسمبر 2013. تم استرجاعه في 13 أغسطس 2019. تم تقديم مفهوم الأحداث المنتظمة بواسطة Kleene من خلال تعريف التعبيرات المنتظمة .
  8. ^ كليين 1951، ص46
  9. ^ ab تومسون 1968.
  10. ^ ab Johnson et al. 1968.
  11. ^ Kernighan, Brian (2007-08-08). "A Regular Expressions Matcher". Beautiful Code . O'Reilly Media . ص 1-2. ISBN 978-0-596-51004-6. تم أرشفة النسخة الأصلية في 2020-10-07 . تم استرجاعها في 2013-05-15 .
  12. ^ ريتشي، دينيس م. "تاريخ غير مكتمل لمحرر النصوص QED". مؤرشف من الأصل في 1999-02-21 . تم الاسترجاع في 9 أكتوبر 2013 .
  13. ^ ab 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. ^ "Documentation: 9.3: Pattern Matching". PostgreSQL . مؤرشف من الأصل في 2020-10-07 . تم الاسترجاع في 2013-10-12 .
  18. ^ Wall, Larry (2006). "Perl Regular Expressions". perlre . مؤرشف من الأصل في 2009-12-31 . تم الاسترجاع في 2006-10-10 .
  19. ^ ab Wall (2002)
  20. ^ "PCRE - Perl Compatible Regular Expressions". www.pcre.org . تم الاسترجاع في 2024-04-07 .
  21. ^ "GRegex – تحليلات أسرع لبيانات النصوص غير المنظمة". grovf.com . مؤرشف من الأصل في 2020-10-07 . تم الاسترجاع في 2019-10-22 .
  22. ^ "CUDA grep". bkase.github.io . مؤرشف من الأصل في 2020-10-07 . تم الاسترجاع 2019-10-22 .
  23. ^ abcd Kerrisk, Michael. "grep(1) - Linux manual page". man7.org . تم الاسترجاع في 31 يناير 2023 .
  24. ^ أب هوبكروفت، موتواني وأولمان (2000)
  25. ^ سيبسر (1998)
  26. ^ جيلاد ونيفين (2008، ص. 332، Thm.4.1)
  27. ^ جروبر وهولتزر (2008)
  28. ^ استنادًا إلى Gelade & Neven (2008)، يمكن العثور على تعبير منتظم بطول حوالي 850 بحيث يكون مكمله بطول حوالي 2 32 في ملف:RegexComplementBlowup.png .
  29. ^ "التعبيرات المنتظمة لتحديد قابلية القسمة". s3.boskent.com . تم الاسترجاع في 2024-02-21 .
  30. ^ جيشر، جاي إل. (1984). (العنوان غير معروف) (تقرير فني). جامعة ستانفورد، قسم علوم الكمبيوتر.[ العنوان مفقود ]
  31. ^ هوبكروفت، جون إي.؛ موتواني، راجيف وأولمان، جيفري دي. (2003). مقدمة إلى نظرية الأتمتة واللغات والحوسبة . أبر سادل ريفر، نيوجيرسي: أديسون ويسلي. ص 117-120. رقم ISBN 978-0-201-44124-6لا يلزم أن تنطبق هذه الخاصية على التعبيرات العادية الممتدة، حتى لو لم تصف فئة أكبر من اللغات العادية؛ راجع ص 121.
  32. ^ كوزين (1991) [ الصفحة مطلوبة ]
  33. ^ Redko, VN (1964). "On defining relations for the algebra of regular events". Ukrainskii Matematicheskii Zhurnal (بالروسية). 16 (1): 120–126. مؤرشف من الأصل في 2018-03-29 . تم الاسترجاع في 2018-03-28 .
  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 BREs Matching Multiple Characters". مواصفات قاعدة مجموعة Open Group، العدد 7، طبعة 2018. مجموعة Open Group. 2017. تم الاسترجاع في 10 ديسمبر 2023 .
  37. ^ روس كوكس (2009). "مطابقة التعبيرات العادية: نهج الآلة الافتراضية". swtch.com . استطراد: مطابقة POSIX الفرعية
  38. ^ "Perl Regular Expression Documentation". perldoc.perl.org. مؤرشف من الأصل في 31 ديسمبر 2009. تم الاسترجاع في 8 يناير 2012 .
  39. ^ ab "Regular Expression Syntax". Python 3.5.0 documentation . Python Software Foundation . مؤرشف من الأصل في 18 يوليو 2018 . تم الاسترجاع في 10 أكتوبر 2015 .
  40. ^ SRE: التجميع الذري (?>...) غير مدعوم #34627
  41. ^ ab "الفئات الأساسية: التعبيرات العادية: المحددات الكمية: الاختلافات بين المحددات الكمية الجشعة والمترددة والمتملك". دروس Java . Oracle . مؤرشف من الأصل في 7 أكتوبر 2020 . تم الاسترجاع في 23 ديسمبر 2016 .
  42. ^ "التجميع الذري". برنامج تعليمي حول التعابير العادية . مؤرشف من الأصل في 7 أكتوبر 2020. تم الاسترجاع في 24 نوفمبر 2019 .
  43. ^ بورمان، كارستن؛ براي، تيم. I-Regexp: تنسيق تعبير عادي قابل للتشغيل المتبادل. فريق عمل هندسة الإنترنت. doi : 10.17487/RFC9485 . RFC 9485 . تم الاسترجاع في 11 مارس 2024 .
  44. ^ Cezar Câmpeanu; Kai Salomaa & Sheng Yu (Dec 2003). "A Formal Study of Practical Regular Expressions". International Journal of Foundations of Computer Science . 14 (6): 1007–1018. doi :10.1142/S012905410300214X. مؤرشف من الأصل في 2015-07-04 . تم الاسترجاع في 2015-07-03 .النظرية 3 (ص9)
  45. ^ "مطابقة التعبيرات العادية في لغة بيرل صعبة للغاية". perl.plover.com . مؤرشف من الأصل في 2020-10-07 . تم الاسترجاع في 2019-11-21 .
  46. ^ Ritchie, DM; Thompson, KL (June 1970). QED Text Editor (PDF) . MM-70-1373-3. مؤرشف من الأصل (PDF) في 2015-02-03 . تم الاسترجاع في 2022-09-05 .أعيد طبعه باسم "دليل مرجعي لمحرر نصوص QED"، MHCC-004، Murray Hill Computing، Bell Laboratories (أكتوبر 1972).
  47. ^ ab Wall, Larry (1994-10-18). "Perl 5: perlre.pod". GitHub .
  48. ^ Wandering Logic. "كيفية محاكاة النظرة إلى الأمام والنظرة إلى الخلف في أتمتة الحالة المحدودة؟". Computer Science Stack Exchange . مؤرشف من الأصل في 7 أكتوبر 2020. تم الاسترجاع في 24 نوفمبر 2019 .
  49. ^ Zakharevich, Ilya (19 نوفمبر 1997). "تم تطبيق تصحيح التعابير العادية الضخمة (مع تعديلات طفيفة): Perl/perl5@c277df4". GitHub .
  50. ^ كوكس (2007)
  51. ^ لوريكاري (2009)
  52. ^ "gnulib/lib/dfa.c". مؤرشف من الأصل في 2021-08-18 . تم الاسترجاع في 2022-02-12 . إذا اكتشف الماسح الضوئي انتقالًا على backref، فإنه يعيد نوعًا من "النجاح الجزئي" مما يشير إلى أنه يجب التحقق من المطابقة باستخدام مطابق التتبع الخلفي.
  53. ^ Kearns, Steven (أغسطس 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. ^ "UTS#18 on Unicode Regular Expressions, Annex A: Character Blocks". مؤرشف من الأصل في 2020-10-07 . تم الاسترجاع في 2010-02-05 .
  59. ^ "regex(3) - صفحة دليل Linux". man7.org . تم الاسترجاع في 2022-04-27 .
  60. ^ "مكتبة التعبيرات العادية - cppreference.com". en.cppreference.com . تم الاسترجاع في 2022-04-27 .
  61. ^ "لغة التعبيرات العادية - مرجع سريع". microsoft.com . 18 يونيو 2022 . تم الاسترجاع 2024-02-20 .
  62. ^ "Pattern (Java Platform SE 7 )". docs.oracle.com . تم الاسترجاع في 2022-04-27 .
  63. ^ "التعبيرات العادية - JavaScript". MDN . تم الاسترجاع في 2022-04-27 .
  64. ^ "مكتبة OCaml: Str". v2.ocaml.org . تم الاسترجاع في 2022-08-21 .
  65. ^ "perlre". perldoc.perl.org . تم الاسترجاع في 2023-02-04 .
  66. ^ "PHP: PCRE - Manual". www.php.net . تم الاسترجاع في 2023-02-04 .
  67. ^ "re – عمليات التعبيرات العادية". docs.python.org . تم الاسترجاع في 2023-02-24 .
  68. ^ "Regex on crates.io". Crates.io . مؤرشف من الأصل في 2022-11-29 . تم الاسترجاع 2023-02-24 .
  69. ^ هورويتز، برادلي (24 أكتوبر 2011). "اكتساح الخريف". مدونة جوجل . مؤرشف من الأصل في 21 أكتوبر 2018. تم الاسترجاع في 4 مايو 2019 .
  70. ^ لا يلزم دائمًا استخدام الحرف "m" لتحديد عملية مطابقة في لغة Perl . على سبيل المثال، m/[^abc]/يمكن أيضًا تقديمه على هيئة /[^abc]/. لا يلزم استخدام الحرف "m" إلا إذا رغب المستخدم في تحديد عملية مطابقة دون استخدام شرطة مائلة للأمام كفاصل للتعبيرات العادية . في بعض الأحيان يكون من المفيد تحديد فاصل تعبير عادي بديل لتجنب " تصادم الفاصلات ". راجع "perldoc perlre Archived 2009-12-31 at the Wayback Machine " لمزيد من التفاصيل.
  71. ^ على سبيل المثال، انظر Java in a Nutshell ، ص 213؛ Python Scripting for Computational Science ، ص 320؛ Programming PHP ، ص 106.
  72. ^ كل عبارات if ترجع قيمة TRUE
  73. ^ كونواي، داميان (2005). "التعبيرات العادية، نهاية السلسلة". أفضل ممارسات بيرل . أوريلي . ص. 240. رقم ISBN 978-0-596-00173-5. تم أرشفة النسخة الأصلية في 2020-10-07 . تم استرجاعها في 2017-09-10 .

مراجع

  • أهو، ألفريد ف. (1990). "خوارزميات للعثور على أنماط في السلاسل". في فان ليوين، جان (المحرر). دليل علوم الكمبيوتر النظرية، المجلد أ: الخوارزميات والتعقيد . مطبعة معهد ماساتشوستس للتكنولوجيا. ص 255-300.
  • أهو، ألفريد ف.؛ أولمان، جيفري د. (1992). "الفصل 10. الأنماط، والأتمتة، والتعبيرات العادية" (PDF) . أساسيات علوم الكمبيوتر. مؤرشف من الأصل في 2020-10-07 . تم الاسترجاع في 2013-12-14 .
  • أيكوك، جون (يونيو 2003). "تاريخ موجز للتصنيع في الوقت المناسب" (ملف PDF) . استطلاعات الحوسبة التابعة لـ ACM . 35 (2): 97–113. CiteSeerX  10.1.1.97.3985 . doi :10.1145/857076.857077. S2CID  15345671.
  • "التعبيرات العادية". مواصفات يونكس الموحدة، الإصدار 2. المجموعة المفتوحة. 1997. مؤرشف من الأصل في 2020-10-07 . تم الاسترجاع في 2011-12-13 .
  • "الفصل 9: التعبيرات العادية". مواصفات قاعدة المجموعة المفتوحة (6). المجموعة المفتوحة. 2004. IEEE Std 1003.1، إصدار 2004. مؤرشف من الأصل في 2011-12-02 . تم الاسترجاع في 2011-12-13 .
  • Cox, Russ (2007). "Regular Expression Matching Can Be Simple and Fast". مؤرشف من الأصل في 2010-01-01 . تم الاسترجاع في 2008-04-27 .
  • فورتا، بن (2004). سامز: علم نفسك التعبيرات العادية في 10 دقائق . سامز. رقم ISBN 978-0-672-32566-3.
  • فريدل، جيفري إي إف (2002). إتقان التعبيرات العادية. أوريلي . رقم ISBN 978-0-596-00289-3. تم أرشفة النسخة الأصلية في 2005-08-30 . تم استرجاعها في 2005-04-26 .
  • Gelade, Wouter; Neven, Frank (2008). Succinctness of the Complement and Intersection of Regular Expressions. Proceedings of the 25th International Symposium on Theoretical Aspects of Computer Science (STACS 2008) . ص 325-336. arXiv : 0802.2869 . مؤرشف من الأصل في 2011-07-18 . تم الاسترجاع في 2009-06-15 .
  • جويفيرتس، جان؛ ليفيثان، ستيفن (2009). كتاب الطبخ للتعبيرات العادية . [أوريلي]. رقم ISBN 978-0-596-52068-7.
  • جروبر، هيرمان؛ هولزر، ماركوس (2008). الأتمتة المحدودة، وربط ثنائي الحروف، وحجم التعبيرات العادية (PDF) . وقائع الندوة الدولية الخامسة والثلاثين حول الأتمتة واللغات والبرمجة (ICALP 2008) . مذكرات محاضرات في علوم الكمبيوتر. المجلد 5126. ص 39-50. doi :10.1007/978-3-540-70583-3_4. ISBN 978-3-540-70582-6. مؤرشف من الأصل (PDF) في 2011-07-11 . تم الاسترجاع في 2011-02-03 .
  • حبيبي، مهران (2004). التعبيرات العادية في العالم الحقيقي باستخدام جافا 1.4 . سبرينغر. رقم ISBN 978-1-59059-107-9.
  • هوبكروفت، جون إي.؛ موتواني، راجيف؛ أولمان، جيفري دي. (2000). مقدمة إلى نظرية الأتمتة واللغات والحوسبة (الطبعة الثانية). أديسون ويسلي.
  • جونسون، والتر إل.؛ بورتر، جيمس إتش.؛ أكلي، ستيفاني آي.؛ روس، دوغلاس تي. (1968). "التوليد التلقائي لمعالجات معجمية فعّالة باستخدام تقنيات الحالة المحدودة". اتصالات جمعية الحوسبة الآلية . 11 (12): 805-813. doi : 10.1145/364175.364185 . S2CID  17253809.
  • كلين، ستيفن سي. (1951). "تمثيل الأحداث في الشبكات العصبية والأتمتة المحدودة". في شانون، كلود إي.؛ مكارثي، جون (المحررون). دراسات الأتمتة (PDF) . مطبعة جامعة برينستون. ص. 3-42. مؤرشف (PDF) من الأصل في 2020-10-07 . تم الاسترجاع في 2017-12-10 .
  • كوزين، دكستر (1991). "نظرية الاكتمال لجبر كليين وجبر الأحداث المنتظمة". [1991] وقائع ندوة معهد مهندسي الكهرباء والإلكترونيات السنوية السادسة حول المنطق في علوم الكمبيوتر . ص 214-225. doi :10.1109/LICS.1991.151646. hdl :1813/6963. ISBN 978-0-8186-2230-4. S2CID  19875225.
  • Laurikari, Ville (2009). "TRE library 0.7.6". مؤرشف من الأصل في 2010-07-14 . تم الاسترجاع في 2009-04-01 .
  • Liger, François; McQueen, Craig; Wilton, Paul (2002). دليل معالجة النصوص باستخدام Visual Basic .NET . دار نشر Wrox . رقم ISBN 978-1-86100-730-8.
  • سيبسر، مايكل (1998). "الفصل الأول: اللغات العادية" . مقدمة إلى نظرية الحوسبة . دار نشر PWS. ص 31-90. رقم ISBN 978-0-534-94728-6.
  • ستابلباين، توني (2003). مرجع الجيب للتعبيرات العادية . أوريلي. رقم ISBN 978-0-596-00415-6.
  • تومسون، كين (1968). "تقنيات البرمجة: خوارزمية البحث عن التعابير العادية". اتصالات جمعية الحوسبة الآلية . 11 (6): 419-422. doi : 10.1145/363347.363387 . S2CID  21260384.
  • وول، لاري (2002). "Apocalypse 5: Pattern Matching". مؤرشف من الأصل في 2010-01-12 . تم الاسترجاع في 2006-10-11 .
  • الوسائط المتعلقة بـ Regex في ويكيميديا ​​كومنز
  • ISO/IEC 9945-2:1993 تكنولوجيا المعلومات – واجهة نظام التشغيل المحمول (POSIX) – الجزء 2: الواجهة والأدوات المساعدة
  • ISO/IEC 9945-2:2002 تكنولوجيا المعلومات – واجهة نظام التشغيل المحمول (POSIX) – الجزء 2: واجهات النظام
  • ISO/IEC 9945-2:2003 تكنولوجيا المعلومات – واجهة نظام التشغيل المحمول (POSIX) – الجزء 2: واجهات النظام
  • ISO/IEC/IEEE 9945:2009 تكنولوجيا المعلومات – المواصفات الأساسية لواجهة نظام التشغيل المحمول (POSIX)، الإصدار 7
  • التعبيرات العادية، معيار IEEE 1003.1-2017، مجموعة Open Group
Retrieved from "https://en.wikipedia.org/w/index.php?title=Regular_expression&oldid=1252345058"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate