هل يمكنني تحديد مجموعة الأحرف الأولى التي تتوافق مع نمط Regex؟

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

سؤال

أود أن أكون قادرا على حساب مجموعة جميع الأحرف التي قد تتم مطابقتها أول شخصية في سلسلة من خلال مثيل معين من java.util.regex.Pattern. وبعد أكثر رسميا، بالنظر إلى DFA مكافئ تعبير منتظم معين، أريد مجموعة جميع التحولات الصادرة من حالة البداية.

مثال:

Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+");
Set<Character> first = getFirstSet(p);

مجموعة first يجب أن تحتوي على العناصر التالية:

{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' }

أيه أفكار؟ إنني أدرك جيدا أنه يمكنني إنشاء DFA بنفسي وتحديد الدول ذات الصلة بهذه الطريقة، ولكن أود تجنب هذا النوع من المتاعب (قراءة: لا يستحق ذلك كثيرا بالنسبة لي). لاحظ أن لغتي المضيفة هي في الواقع SCALA، لذلك يمكنني الوصول إلى جميع أنواع الأنغالات الأساسية Scala (لما يستحق).

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

المحلول

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

بعض الأشياء بسيطة:

  • التسلسل: أولا (R1R2) = First (R1) + (إذا "" في First (r1) أولا (R2) آخر مجموعة فارغة)
  • التناوب: أولا (R1 | R2) = First (R1) + First (R2)
  • التكرار: أولا (R *) = أولا (R) + ''
  • الشخصيات: أولا (ج) = ج
  • الطابعات: أولا ([C1-CN]) = SET (C1، C2، ...، CN) ...

قم بتوسيع ذلك لجميع البدائيات والأعلام الخاصة لهجة التعبير العادية تعرف وأنت جيد للذهاب.

نصائح أخرى

يمكنك حلها بشكل مباشر ...

  • شريط من أرفق الأقواس والاتصال باستمرار.
  • انقسام في بدائل TopLevel واتصل بإعادة تركيا لكل جزء.
  • إذا لم يكن هناك بدائل،
    • إخراج جميع الرموز بدءا من اليسار إلى رمز اختياري لأي مقابل.
    • إذا كانت هناك مجموعات الكاراختر، إخراج جميع الرموز.

ربما هناك الكثير من الأخطاء في هذه الفكرة، ولكن هذا ما سأحاوله. يجب عليك تجريد تأكيد أسماء المجموعات وألف أشياء أخرى. وإذا وجدت فئة حرف مقلوبة مثل [^ 0-9] عليك إخراج الكثير من الأحرف.

لذلك أفترض أنها مشكلة معقدة حقا.

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