Scroll to navigation

regex(7) Miscellaneous Information Manual 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 (شمولاً) من مطابقات الذرة.

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

التعبير بين حاصرتين هو قائمة من المحارف المحصورة بين "[]". يطابق عادةً أي محرف مفرد من القائمة (لكن انظر أدناه). إذا بدأت القائمة بـ '^'، فإنه يطابق أي محرف مفرد (لكن انظر أدناه) ليس من بقية القائمة. إذا فُصل بين محرفين في القائمة بـ '-'، فهذا اختصار لـ نطاق كامل من المحارف بين هذين المحرفين (شاملًا إياهما) في تسلسل الترتيب، فعلى سبيل المثال، تطابق "[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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

15 يونيو 2024 صفحات دليل لينكس 6.9.1