سؤال

أنا أتعلم حاليا لوا. فيما يتعلق بمطابقة الأنماط في لوا ، وجدت الجملة التالية في وثائق لوا على lua.org:

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

بما أنني على دراية بالتعبيرات العادية Posix ، أود أن أعرف ما إذا كانت هناك أي عينات شائعة حيث تكون مطابقة نمط LUA "أفضل" مقارنة بالتعبير العادي - أم أنني أساءت تفسير الجملة؟ وإذا كان هناك أي أمثلة شائعة: لماذا يعتبر أي من التعبيرات المنتظمة مقابل التعبيرات المنتظمة أكثر ملاءمة؟

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

المحلول

هل أي عينات شائعة حيث تطابق نمط لوا "أفضل" مقارنة بالتعبير العادي؟

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

فيما يلي بعض العوامل التي تسهم في التصميم الجيد:

  • بناء جملة خفيف الوزن للغاية لمطابقة أنواع الأحرف الشائعة بما في ذلك الأحرف الكبيرة (%u)، أرقام عشرية (%d) ، أحرف الفضاء (%s) وهلم جرا. يمكن تكملة أي نوع من الحرف باستخدام الحرف الرأسمالي المقابل ، لذلك نمط %S يطابق أي شخصية غير مسافة.

  • اقتباس بسيط للغاية ومنتظم. شخصية الاقتباس هي %, ، لذلك يتميز دائمًا عن الحرف الذي يسخر من السلسلة \, ، مما يجعل أنماط LUA أسهل بكثير من القراءة من التعبيرات العادية POSIX (عند الاقتباس ضروري). من الآمن دائمًا اقتباس الرموز ، وليس من الضروري أبدًا اقتباس الحروف ، حتى تتمكن من الذهاب إلى قاعدة الإبهام هذه بدلاً من حفظ الرموز التي هي metacharacters الخاصة.

  • تقدم Lua "التقاطات" ويمكنها إعادة التقاطات متعددة نتيجة match مكالمة. هذه الواجهة أفضل بكثير من التقاط الفرعية من خلال الآثار الجانبية أو وجود بعض الحالة الخفية التي يجب استجوابها للعثور على التقاطات. بناء جملة التقاط بسيط: ما عليك سوى استخدام الأقواس.

  • لوا لديه "أقصر مباراة" - المعدل للذهاب مع "أطول مباراة" * المشغل أو العامل. على سبيل المثال s:find '%s(%S-)%.' يجد أقصر تسلسل من أحرف غير المسافة التي سبقتها الفضاء وتليها نقطة.

  • القوة التعبيرية لأنماط LUA مماثلة للتعبيرات العادية "الأساسية" ، دون مشغل التناوب |. ما تتخلى عنه هو "تمديد" التعبيرات العادية مع |. إذا كنت بحاجة إلى الكثير من القوة التعبيرية ، أوصي بالذهاب إلى الطريق LPEG مما يمنحك بشكل أساسي قوة القواعد الخالية من السياق بتكلفة معقولة للغاية.

نصائح أخرى

http://lua-users.org/wiki/librariesandbindings يحتوي على قائمة بالوظائف بما في ذلك مكتبات Regex إذا كنت ترغب في متابعة استخدامها.

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

تحرير] لقد وجدت للتو في النسخة عبر الإنترنت من البرمجة في لوا (مورد ممتاز لتعلم اللغة) حيث يتم وصف ذلك من قبل أحد مبادئ اللغة: راجع التعليقات أدناه [/edit

أجد شخصياً أن النمط الافتراضي الذي يوفر LUA يرضي معظم احتياجاتي regex-y. قد تختلف الأميال الخاصة بك.

حسنًا ، مجرد ملاحظة خفيفة لهذه المناقشة ؛ لقد شعرت بالارتباك بشكل خاص من هذه الصفحة:

تعبيرات منتظمة

منذ ذلك الحين يقول \s يطابق المسافة البيضاء ، كما أعرف من بناء جملة التعبير العادي الأخرى ... ولذا فإنني أحاول ذلك في قذيفة:

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> c="   d"
> print(c:match(" "))

> print(c:match("."))

> print(c:match("\s"))
nil
> print("_".. c:match("[ ]") .."_")
_ _
> print("_".. c:match("[ ]*") .."_")
_   _
> print("_".. c:match("[\s]*") .."_")
__

هممم ... يبدو \s لا يتم التعرف عليه هنا - بحيث تشير هذه الصفحة على الأرجح إلى التعبير العادي في Scite's Find/Reliver - وليس إلى بناء جملة Lua's Regex (الذي يستخدمه Scite أيضًا).

ثم أعيد قراءة Lua-Users Wiki: أنماط البرنامج التعليمي, ، وابدأ في الحصول على التعليق حول شخصية الهروب %, ، ليس \ في normanramseyإجابة. لذا ، حاول هذا:

> print("_".. c:match("[%s]*") .."_")
_   _

... هل يعمل بالفعل.

لذلك ، كما اعتقدت في الأصل أن "أنماط" لوا هي أوامر/محرك مختلف من "التعبير العادي" في لوا ، أعتقد أن هناك طريقة أفضل لأقول إنها: "أنماط" لوا "لوا" نكون بناء جملة/محرك "التعبير العادي" الخاص بـ LUA (بمعنى آخر ، لا يوجد اثنان منهم :) )

هتافات!

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