سؤال

أجد صعوبة في التخلص من أجزاء التعبير التي لا أريدها، والاحتفاظ بالأجزاء التي أريدها.

المشكلة هي - بالنظر إلى سلسلة الإدخال:

{if cond}foo{else}bar{/if}

أود فقط أن يكون لدي:

0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: bar

وبالنسبة لسلسلة الإدخال:

{if cond}foo{/if}

أود فقط أن يكون لدي:

0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: 

يبدو التعبير العادي الذي لدي في الوقت الحالي كما يلي:

\{if ([a-z0-9]+)\}([^\{]*?)(((?:\{else\})?)(.*?)?)\{/if\}

أحصل على البيانات التالية مرة أخرى:

0: {if cond}foo{else}bar{/if}
1: cond
2:
3: foo{else}bar
4:
5: foo{else}bar

الأمر الذي يتطلب المزيد من التحليل لل foo{else}bar بت للحصول على القيم المعنية.

هل التعبير العادي الخاص بي قريب من أي مكان؟

لست قلقًا جدًا بشأن نوع البيانات التي قد يتم تجاوزها - بما في ذلك { في نص عبارة if يُسمح بكسر التعبير العادي.قيم foo و bar يمكن أن يكون أي شيء لا يتضمن أ {.

شكرًا،

دوم

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

المحلول

وماذا عن هذا؟

\{if ([a-z0-9]+)\}([^\{]*)(?:\{else\})?([^\{]*)\{/if\}

نصائح أخرى

وهذا يجب أن تعمل:

{if\s+([^}]*)}([^{]*)(?:{else}([^{]*))?{/if}

والهروب وفقا لاحتياجاتك

التعبيرات المنتظمة اختبار . ويستخدم المحرك باستخدام التعابير المنطقية .NET، لكنها قد تكون في متناول اليدين.

لقد تم ذكر هذه الملاحظة في سؤالك، ولكن من العلامات يبدو أنك تستخدم مكتبة Boost C++.

ربما يكون من المفيد أيضًا إلقاء نظرة على مكتبة Boost.Spirit (المضمنة في Boost).يسمح لك Spirit.Qi بتحليل البيانات المعقدة، بينما تبدو القواعد النحوية مثل EBNF.بينما يسمح برنامج Spirit.Karam المصاحب بتحديد تنسيق الإخراج، مرة أخرى في بناء الجملة مثل EBNF.

باستخدام هذه المكتبة، يمكنك إنشاء AST من المستند القالب ومعالجته ثم إنشاء مستند الإخراج.

بجانب توثيق Boost.Spirit, ، هناك بعض الشرائح الرائعة من 2007 و 2008 والتي تعطي مقدمة جيدة إلى حد ما.

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