السلوك المتوقع من مدد POSIX التعابير المنطقية: (() | اي بي سي) س ع ص

StackOverflow https://stackoverflow.com/questions/1436194

  •  07-07-2019
  •  | 
  •  

سؤال

في بلدي OS X 10.5.8 الجهاز، وذلك باستخدام وظائف regcomp وregexec C لمطابقة التعبير المعتاد الموسعة "(() | اي بي سي) س ع ص"، والعثور على تطابق عن السلسلة "abcxyz" ولكن فقط من تعويض 3 ل تعويض كان 6. توقعي أن السلسلة بأكملها سوف تكون مطابقة والتي أود أن أرى submatch بالنسبة للجزء الأولي "اي بي سي" من السلسلة.

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

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

وأنا أفهم أن "((اي بي سي) {0،1}) س ع ص" يمكن أن تستخدم كبديل، ولكن يتم إنشاء نمط من الفائدة تلقائيا من شكل نمط آخر والقضاء على حالات "()" هو العمل الإضافي أود أن تجنب إذا أمكن ذلك.

لإشارة، أعلام أنا عابرة إلى regcomp تتكون فقط من REG_EXTENDED. أمرر مجموعة فارغة من الأعلام (0) إلى regexec.

هل كانت مفيدة؟

المحلول

يقول POSIX معيار:

<اقتباس فقرة>   

و9.4.3 أحرف ERE الخاصة

     

وعلى حرف خاص ERE ديه خصائص خاصة في سياقات معينة. خارج تلك السياقات، أو عندما يسبقه <backslash>، يجب أن يكون مثل هذا الطابع على ERE يطابق طابع خاص نفسها. التعبير العادي أحرف خاصة الموسعة والسياقات التي يكون معنى خاص هي كما يلي:

     

و.[\(

     

ويقوم <period>، <left-square-bracket>، <backslash>، و<left-parenthesis> يكون خاصا إلا عند استخدامها في تعبير قوس (انظر RE القوس التعبير). خارج تعبير قوس، و<left-parenthesis> تليها مباشرة على <right-parenthesis> يؤدي إلى نتائج غير محددة.

وما تراه هو نتيجة الاحتجاج سلوك غير معرف - كل شيء مباح

.

إذا كنت تريد نتائج المحمولة موثوق بها، سيكون لديك للقضاء على الفارغة الرموز "()".

نصائح أخرى

إذا أعاد على جميع المباريات، وعدم الحصول على حد سواء [3،6) و[0،6)، ثم هناك خلل. لست متأكدا ما ولايات POSIX بقدر الترتيب الذي يتم إرجاع مباريات.

وحاول (abc|())xyz - أراهن أنها سوف تنتج نفس النتيجة في كلا المكانين. أستطيع أن أفترض فقط أن الإصدار C هو محاولة لمطابقة xyz أينما ما في وسعها، وإذا فشل ذلك، يحاول مطابقة abcxyz أينما ما في وسعها (ولكن، وكما ترون، فإنه لا تفشل، لذلك نحن لا تهتم " اي بي سي "جزئيا) في حين awk يجب استخدامه هو المحرك باستخدام التعابير المنطقية الخاصة التي تنفذ بالطريقة التي تتوقعها.

والتعابير المنطقية الخاص بك هو صالح. أعتقد أن المشكلة هي إما أ) POSIX ليس واضحا جدا حول الكيفية التي ينبغي أن يعمل التعبير المعتاد، أو ب) awk لا يستخدم 100٪ POSIX المتوافقة regexes (ربما لأنه يبدو السفن OS X مع نسخة أكثر الأصلي awk ). أيهما المشكلة هو عليه، وربما الناجمة لأن هذا هو نوعا من حالة حافة ومعظم الناس لا يكتب التعبير المعتاد بهذه الطريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top