سؤال
هل من الممكن تحقيقه في لوا؟
local noSlashEnding = string.gsub("slash\\ending\\string\\", "\\|/$", "")
-- noSlashEnding should contain "slash\\ending\\string"
local noSlashEnding2 = string.gsub("slash/ending/string/", "\\|/$", "")
-- noSlashEnding2 should contain "slash/ending/string"
النقطة هنا هي عدم قبول العبارات المنطقية "أو" في أنماط لوا.
تحرير: فقط أدرك أن هذا ممكن عن طريق القيام بذلك:
strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")
على الرغم من أن المنطق "أو" للأنماط لا يزال مفقودًا.
المحلول
لا يستخدم Lua التعبيرات العادية القياسية لمطابقة الأنماط. اقتباس من الكتاب البرمجة في لوا يشرح السبب:
على عكس العديد من لغات البرمجة النصية الأخرى ، لا تستخدم LUA تعبيرات POSIX العادية (REGEXP) لمطابقة الأنماط. السبب الرئيسي لذلك هو الحجم: التنفيذ النموذجي لـ POSIX REGEXP يستغرق أكثر من 4000 سطر من التعليمات البرمجية. هذا أكبر من جميع المكتبات القياسية لوا معًا. بالمقارنة ، فإن تنفيذ مطابقة الأنماط في لوا لديه أقل من 500 سطر. بالطبع ، لا يمكن للنمط المطابق في لوا فعل كل ما يفعله تطبيق POSIX الكامل. ومع ذلك ، فإن مطابقة الأنماط في LUA هي أداة قوية وتتضمن بعض الميزات التي يصعب مطابقة تطبيقات POSIX القياسية.
ومع ذلك ، هناك العديد من الارتباطات لمكتبات التعبير العادية الحالية وكذلك المتقدمة LPEG مكتبة. للحصول على قائمة بها مع روابط ، انظر http://lua-users.org/wiki/librariesandbindings, ، الفصل Text processing
.
أيضا ، انظر هذا السؤال: مطابقة نمط لوا مقابل التعبيرات العادية
نصائح أخرى
لوا نمط مطابقة ليس هو نفسه التعبيرات العادية ، وليس لديه مفهوم بالتناوب.
على سبيل المثال ، إذا أردت الإزالة "abc"
أو "efg"
من نهاية سلسلة (على غرار "(abc|efg)$"
تعبير منتظم) سوف يعمل الكود التالي بشكل جيد:
local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg
تعبيرات لوا العادية ... غير طبيعية. بقدر ما أستطيع أن أقول من الوثائق ، لا يوجد أي دعم للتناوب العام ، ولا لتطبيق مشغلي التكرار على المجموعات. في حالتك ، كما تقول ، يمكنك الحصول على ما تريد مع فصل شخصية (لست متأكدًا مما تفعله الفاصلة في فصل شخصيتك ، رغم ذلك).
انظر هنا: http://www.lua.org/manual/5.1/manual.html#5.4.1
(في مشروع اعتدت على العمل عليه ، كتبنا LUA الخاص بنا إلى PCRE بسبب هذا.)