سؤال

هل من الممكن تحقيقه في لوا؟

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 بسبب هذا.)

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