سؤال

لقد رأيت الكثير من القواسم المشتركة في إمكانيات التعبير العادي لمختلف الأدوات/اللغات التي تدعم التعبير العادي (على سبيل المثال.Perl، وsed، وjava، وvim، وما إلى ذلك)، ولكن لدي أيضًا العديد من الاختلافات.

هل يوجد معيار مجموعة فرعية من إمكانيات regex التي ستدعمها جميع الأدوات/اللغات التي تدعم regex؟كيف تختلف قدرات regex بين الأدوات/اللغات؟

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

المحلول

قارن نكهات التعبير العادي

http://www.regular-expressions.info/refflavors.html

نصائح أخرى

تدعم معظم أدوات/لغات التعبير العادي هذه القدرات الأساسية:

  1. فئات/مجموعات الأحرف ونفيها - []
  2. المراسي - ^$
  3. التناوب - |
  4. محددات الكمية - ?+*{n,m}
  5. الأحرف الأولية - \w، \s، \d، ...
  6. المراجع الخلفية - \1، \2، ...
  7. نقطة - .
  8. المعدلات البسيطة مثل /g و /i لحالة الأحرف العامة وحالة التجاهل
  9. الشخصيات الهاربة

دعم الأدوات/اللغات الأكثر تقدمًا:

  1. الناظرون والخلف
  2. فئات الأحرف POSIX
  3. حدود الكلمات
  4. المفاتيح المضمنة مثل السماح بعدم حساسية حالة الأحرف لقسم صغير فقط من التعبير العادي
  5. المعدلات مثل /x للسماح بمزيد من التنسيق والتعليقات، و/m للسطر المتعدد
  6. الالتقاطات المسماة
  7. يونيكود

إذا أخذت قواعد grep regexp، وليس قواعد egrep، أو قواعد sed regexp واستخدمت ذلك، فيجب أن تستخدم مجموعة فرعية آمنة عبر العديد من الأنظمة الأساسية والأدوات.

الشيء الوحيد الذي قد يضايقك هو عندما تنتقل بين تطبيقات regexp باستخدام Finite State Automatons (FSA) وتلك التي تستخدم التراجع، على سبيل المثال.ستختلف تطبيقات المُحدد الكمي من grep إلى Perl.

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

النظر في السلسلة "xyxyxyzz", ، والنمط "(xy)*(xyz)?".سوف تتطابق المحركات المعتمدة على FSA مع أطول سلسلة فرعية ممكنة، "xyxyxyz".سوف تتطابق المحركات المعتمدة على التتبع الخلفي مع السلسلة الفرعية الأولى المتحيزة لليسار، "xyxyxy".

لا يوجد محرك قياسي.ومع ذلك، فإن تنسيق POSIX Extended Regular Expression هو مجموعة فرعية صالحة لمعظم المحركات وربما يكون أقرب ما يمكن إلى مجموعة فرعية موحدة.

راجع بناء جملة التعبير العادي لـ emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.

أذكر أنني قرأت أن بناء جملة emacs تم وضعه في حجر (لأسباب تتعلق بالتوافق مع الإصدارات السابقة)، لذلك إذا كنت تريد أن تكون متوافقًا مع كل شئ, ، اجعل كل شيء متوافقًا مع هذا.قد تدعمها بعض الأدوات، وقد لا تدعمها أدوات أخرى.

على الرغم من أن لديك هدفًا جديرًا بالاهتمام، إلا أنني أعتقد أنه سيكون من الصعب جدًا تحقيقه، وقد وجدت أيضًا صعوبة في التعامل مع التعبيرات العادية الخاصة بـ emacs.ربما يكون 99% من كل شيء جيدًا بما يكفي إذا كان يجعلك أكثر سعادة وإنتاجية؟

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