regex(7)

الاسم
regex - تعابير POSIX.2 القياسية

الوصف
تأتي التعابير القياسية ("RE"s)، كما عُرّفت في POSIX.2، في شكلين: التعابير القياسية الحديثة (وهي تقريباً تلك الخاصة بـ egrep(1)؛ ويسميها POSIX.2 التعابير "الموسعة") والتعابير القياسية المهجورة (وهي تقريباً تلك الخاصة بـ ed(1)؛ ويسميها POSIX.2 التعابير "الأساسية"). توجد التعابير المهجورة غالباً للتوافقية مع البرامج القديمة؛ وسيُناقش أمرها في النهاية. يترك معيار POSIX.2 بعض جوانب بناء جملة التعابير القياسية ودلالاتها مفتوحة؛ وتحدد العلامة "(!)" القرارات المتعلقة بهذه الجوانب التي قد لا تكون قابلة للنقل بالكامل إلى تطبيقات POSIX.2 الأخرى.

التعبير القياسي (الحديث) هو فرع واحد(!) أو أكثر من الفروع غير الفارغة(!)، يفصل بينها '|'. وهو يطابق أي شيء يطابق أحد هذه الفروع.

الفرع هو قطعة واحدة(!) أو أكثر، متسلسلة. وهو يطابق مطابقة للقطعة الأولى، تليها مطابقة للثانية، وهكذا.

القطعة هي ذرة قد يتبعها رمز واحد(!) هو '*' أو '+' أو '?' أو قيد. الذرة المتبوعة بـ '*' تطابق تسلسلاً من 0 أو أكثر من مطابقات تلك الذرة. والذرة المتبوعة بـ '+' تطابق تسلسلاً من 1 أو أكثر من مطابقات تلك الذرة. والذرة المتبوعة بـ '?' تطابق تسلسلاً من 0 أو 1 من مطابقات الذرة.

القيد هو '{' يليه عدد صحيح عشري غير موقع، يليه اختيارياً ',' ثم يليه اختيارياً عدد صحيح عشري آخر غير موقع، وينتهي دائماً بـ '}'. يجب أن تقع الأعداد الصحيحة بين 0 و RE_DUP_MAX (255(!)) شمولاً، وإذا وُجد عددان، فلا يجوز أن يتجاوز الأول الثاني. الذرة المتبوعة بقيد يحتوي على عدد صحيح واحد i وبدون فاصلة تطابق تسلسلاً من i من مطابقات الذرة بالضبط. والذرة المتبوعة بقيد يحتوي على عدد صحيح واحد i وفاصلة تطابق تسلسلاً من i أو أكثر من مطابقات الذرة. والذرة المتبوعة بقيد يحتوي على عددين صحيحين i و j تطابق تسلسلاً من i إلى j (شمولاً) من مطابقات الذرة.

الذرة هي تعبير قياسي محصور بين "()" (تطابق ما يطابقه التعبير القياسي)، أو مجموعة فارغة من "()" (تطابق السلسلة الفارغة)(!)، أو تعبير بين حاصرتين (انظر أدناه)، أو '.' (تطابق أي محرف مفرد)، أو '^' (تطابق السلسلة الفارغة في بداية السطر)، أو '$' (تطابق السلسلة الفارغة في نهاية السطر)، أو '\' متبوعاً بأحد المحارف "^.[$()|*+?{\" (تطابق ذلك المحرف بوصفه محرفاً عادياً)، أو '\' متبوعاً بأي محرف آخر(!) (تطابق ذلك المحرف بوصفه محرفاً عادياً، كما لو أن '\' لم تكن موجودة(!))، أو محرف مفرد ليس له أهمية أخرى (يطابق ذلك المحرف). رمز '{' متبوعاً بمحرف غير الرقم هو محرف عادي، وليس بداية قيد(!). من غير القانوني إنهاء تعبير قياسي بـ '\'.

التعبير بين حاصرتين هو قائمة من المحارف محصورة بين "[]". وهو يطابق عادةً أي محرف مفرد من القائمة (ولكن انظر أدناه). إذا بدأت القائمة بـ '^'، فإنها تطابق أي محرف مفرد ليس من بقية القائمة. إذا فُصل بين محرفين في القائمة بواسطة '-'، فهذا اختصار لنطاق كامل من المحارف بين هذين الاثنين (شمولاً) في تسلسل الترتيب، على سبيل المثال، "[0-9]" في ASCII يطابق أي رقم عشري. من غير القانوني(!) اشتراك نطاقين في نقطة نهاية، مثلاً "a-c-e". تعتمد النطاقات اعتماداً كبيراً على تسلسل الترتيب، ويجب على البرامج القابلة للنقل تجنب الاعتماد عليها.

لتضمين المحرف ']' حرفياً في القائمة، اجعله المحرف الأول (بعد '^' المحتملة). ولتضمين '-' حرفياً، اجعله المحرف الأول أو الأخير، أو نقطة النهاية الثانية لنطاق. لاستخدام '-' حرفياً كنقطة نهاية أولى لنطاق، احصره بين "[." و ".]" لجعله عنصر ترتيب (انظر أدناه). باستثناء هذه وبعض المجموعات التي تستخدم '[' (انظر الفقرات التالية)، تفقد جميع المحارف الخاصة الأخرى، بما في ذلك '\'، أهميتها الخاصة داخل التعبير بين حاصرتين.

داخل التعبير بين حاصرتين، عنصر الترتيب (محرف، أو تسلسل متعدد المحارف يُرتب كأنه محرف واحد، أو اسم تسلسل ترتيب لأي منهما) محصور بين "[." و ".]" يمثل تسلسل المحارف لذلك العنصر. التسلسل هو عنصر واحد في قائمة التعبير بين حاصرتين. وبذلك يمكن للتعبير بين حاصرتين الذي يحتوي على عنصر ترتيب متعدد المحارف أن يطابق أكثر من محرف واحد، فمثلاً إذا كان تسلسل الترتيب يتضمن عنصر الترتيب "ch"، فإن التعبير القياسي "[[.ch.]]*c" يطابق أول خمسة محارف من "chchcc".

داخل التعبير بين حاصرتين، عنصر الترتيب المحصور بين "[=" و "=]" هو فئة تكافؤ، تمثل تسلسلات المحارف لجميع عناصر الترتيب المكافئة لهذا العنصر، بما في ذلك نفسه. (إذا لم تكن هناك عناصر ترتيب مكافئة أخرى، يُعامل كما لو كانت المحددات المحيطة هي "[." و ".]"). على سبيل المثال، إذا كان o و ô عضوين في فئة تكافؤ، فإن "[[=o=]]" و "[[=ô=]]" و "[oô]" كلها مترادفة. قد لا تكون فئة التكافؤ(!) نقطة نهاية لنطاق.

داخل التعبير بين حاصرتين، اسم فئة المحارف المحصور بين "[:" و ":]" يمثل قائمة بجميع المحارف المنتمية لتلك الفئة. أسماء فئات المحارف القياسية هي:

    alnum | digit | punct
    alpha | graph | space
    blank | lower | upper
    cntrl | print | xdigit

تمثل هذه فئات المحارف المعرفة في wctype(3). قد توفر المجموعات المحلية غيرها. لا يجوز استخدام فئة محارف كنقطة نهاية لنطاق.

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

تُقاس أطوال المطابقة بالمحارف، وليس بعناصر الترتيب. تُعتبر السلسلة الفارغة أطول من عدم وجود مطابقة على الإطلاق. على سبيل المثال، "bb*" يطابق المحارف الثلاثة الوسطى من "abbbc"، و "(wee|week)(knights|nights)" يطابق جميع المحارف العشرة لـ "weeknights"، وعند مطابقة "(.*).*" مقابل "abc" يطابق التعبير الفرعي بين قوسين المحارف الثلاثة جميعها، وعند مطابقة "(a*)*" مقابل "bc" يطابق كل من التعبير القياسي الكلي والتعبير الفرعي بين قوسين السلسلة الفارغة.

إذا حُددت مطابقة غير حساسة لحالة الأحرف، يكون التأثير كما لو أن جميع الفروق بين حالات الأحرف قد اختفت من الأبجدية. عندما يظهر حرف أبجدي موجود في حالات متعددة كمحرف عادي خارج التعبير بين حاصرتين، فإنه يُحول فعلياً إلى تعبير بين حاصرتين يحتوي على كلتا الحالتين، مثلاً، 'x' يصبح "[xX]". وعندما يظهر داخل تعبير بين حاصرتين، تُضاف جميع نظائره من الحالات الأخرى إلى التعبير، بحيث يصبح "[x]" مثلاً "[xX]" ويصبح "[^x]" هو "[^xX]".

لا يفرض أي حد معين على طول التعابير القياسية(!). يجب ألا تستخدم البرامج التي يُراد لها أن تكون قابلة للنقل تعابير قياسية أطول من 256 بايت، حيث يمكن للتطبيق رفض قبول هذه التعابير مع البقاء متوافقاً مع معيار POSIX.

تختلف التعابير القياسية المهجورة ("الأساسية") في عدة جوانب. المحارف '|' و '+' و '?' هي محارف عادية ولا يوجد معادل لوظائفها. محددات القيود هي "\{" و "\}"، مع كون '{' و '}' بمفردهما محارف عادية. الأقواس للتعابير الفرعية المتداخلة هي "\(" و "\)"، مع كون '(' و ')' بمفردهما محارف عادية. '^' هو محرف عادي إلا في بداية التعبير القياسي أو(!) بداية تعبير فرعي بين قوسين، و '$' هو محرف عادي إلا في نهاية التعبير القياسي أو(!) نهاية تعبير فرعي بين قوسين، و '*' هو محرف عادي إذا ظهر في بداية التعبير القياسي أو بداية تعبير فرعي بين قوسين (بعد '^' بادئة محتملة).

أخيراً، هناك نوع رئيس جديد من الذرات، وهو المرجع الخلفي: المحرف '\' متبوعاً برقم عشري غير صفري d يطابق نفس تسلسل المحارف الذي طابقه التعبير الفرعي المرقّم بـ d بين قوسين (تُرقم التعابير الفرعية حسب مواقع أقواس الفتح الخاصة بها، من اليسار إلى اليمين)، بحيث يطابق مثلاً "\([bc]\)\1" سلسلة "bb" أو "cc" ولكن ليس "bc".

العلل
وجود نوعين من التعابير القياسية هو عمل رديء.

تقول مواصفات POSIX.2 الحالية أن ')' هو محرف عادي في غياب '(' غير متطابقة؛ كان هذا نتيجة غير مقصودة لخطأ في الصياغة، ومن المرجح أن يتغير. تجنب الاعتماد عليه.

المراجع الخلفية هي عمل رديء للغاية، وتسبب مشاكل كبيرة للتطبيقات الفعالة. كما أنها معرفة بشيء من الغموض (هل يطابق "a\(\(b\)*\2\)*d" سلسلة "abbbd"؟). تجنب استخدامها.

توصيف POSIX.2 للمطابقة غير الحساسة لحالة الأحرف غامض. تعريف "حالة واحدة تعني كل الحالات" المذكور أعلاه هو الإجماع الحالي بين المطورين حول التفسير الصحيح.

المؤلف
أُخذت هذه الصفحة من حزمة regex الخاصة بهنري سبنسر.

انظر أيضًا
grep(1)، regex(3)

معيار POSIX.2، القسم 2.8 (ترميز التعبير القياسي).

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.