سؤال

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

النمط الذي توصلت إليه حتى الآن هو: (؟ [ " ']) (.-) ٪ 1

هذا يعمل في بعض الحالات ، ولكن ليس كل الحالات:

Working: "This \"is a\" string of \"text to\" test with"

Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h"

في مثال غير العمل ، أود أن يتطابق مع ذلك (لقد صنعت وظيفة تحصل على المباريات التي أرغب فيها ، أنا فقط أبحث عن نمط لاستخدامه مع GSUB وفضولي إذا كان بإمكان نمط LUA القيام بذلك):

 string
 a" string" of
is' a" string" of' text
test
his "is' a" string" of' text" to "test" wit

سأستمر في استخدام وظيفتي بدلاً من ذلك في الوقت الحالي ، لكنني أشعر بالفضول إذا كان هناك نمط يمكنني/يجب أن أستخدمه وأنا فقط أفتقد شيئًا مع أنماط.

(بعض التعديلات B/C نسيت تشكيل StackOverflows) (تحرير آخر لجعل مثالًا غير HTML لأنه يؤدي إلى افتراضات أنني كنت أحاول تحليل HTML)

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

المحلول

إن محاولة مطابقة النص الهاربين ، فإن النص المقتبس باستخدام التعبيرات العادية يشبه محاولة إزالة الإقحوانات (واللحف فقط) من حقل باستخدام جزازة الحشائش.

لقد صنعت وظيفة تحصل على المباريات التي أرغب فيها

هذه هي الخطوة الصحيحة.

أنا فضولي إذا كان نمط لوا يمكنه القيام بذلك

من وجهة نظر عملية ، حتى لو كان النمط يمكن أن يفعل ذلك ، فأنت لا تريد ذلك. من وجهة نظر نظرية ، تحاول العثور على اقتباس مزدوج يسبقه عدد زوجي من الخلف. هذه بالتأكيد لغة منتظمة ، والتعبير العادي الذي تريده سيكون شيئًا مثل ما يلي (اتفاقيات لوا)

[[[^\](\\)*"(.-[^\](\\)*)"]]

وستكون السلسلة المقتبسة النتيجة رقم 2. لكن أنماط لوا ليس تعبيرات منتظمة كاملة ؛ على وجه الخصوص ، لا يمكنك وضع ملف * بعد نمط أقواس. لذا أظن أنه لا يمكن حل هذه المشكلة باستخدام أنماط LUA ، ولكن نظرًا لأن أنماط LUA ليست شيئًا قياسيًا في نظرية Automata ، فأنا لست على دراية بأي مجموعة من تقنية الإثبات التي يمكنك استخدامها لإثبات ذلك.

نصائح أخرى

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

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

لغة نمط لوا كافية للعديد من الحالات البسيطة. ولديها خدعة واحدة على الأقل لا تجدها في حزمة تعبير منتظمة نموذجية: طريقة لمطابقة قوسين متوازنة. ولكن لديها حدودها كذلك.

عندما يتم تجاوز هذه الحدود ، ثم وصلت إلى LPEG. LPEG هو تنفيذ أ تحليل التعبير Grammer بالنسبة إلى لوا ، وتم تنفيذه من قبل أحد المؤلفين الأصليين في لوا ، لذا فإن التكيف مع لوا يتم بشكل جيد. يسمح PEG بمواصفات أي شيء من الأنماط البسيطة من خلال كتابة قواعد اللغة الكاملة. يقوم LPEG بتجميع القواعد النحوية إلى رمز bytecode وينفذها بكفاءة للغاية.

يجب ليس تحاول تحليل HTML مع تعبيرات منتظمة ، HTML و XML ليس اللغات العادية ولا يمكن معالجتها بنجاح مع تعبيرات منتظمة. يجب عليك استخدام محلل HTML مخصص. إليك الكثير من التفسيرات لماذا.

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