string.match()
جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 38 من 54.
بينما يخبرك string.find() بمكان ظهور نمط معين في سلسلة نصية، فأنت تحتاج أحياناً إلى استخراج النص الفعلي الذي تمت مطابقته. وهنا يأتي دور string.match()، والذي يصبح أكثر قوة عند استخدامه مع الالتقاطات (captures).
تسمح لك الالتقاطات (Captures) بتمييز أجزاء محددة من النمط الذي تريد استخراجه. يمكنك إنشاء التقاط عن طريق إحاطة جزء من نمطك بين قوسين (). عندما تجد الدالة string.match() تطابقاً، فإنها تعيد النص الملتقط بدلاً من مجرد الموقع.
إليك مثال بسيط لاستخراج رقم من سلسلة نصية:
local text = "Player score: 100"
local number = string.match(text, "%d+")
print(number) -- المخرجات: 100النمط %d+ يعني "رقم واحد أو أكثر". الـ + هو معدل يطابق واحداً أو أكثر من فئة الأحرف السابقة، مما يسمح لك بالتقاط أرقام متعددة الخانات.
يمكنك استخدام الالتقاطات (captures) لاستخراج أجزاء محددة من نمط أكثر تعقيداً:
local message = "User: Alice sent a message"
local username = string.match(message, "User: (%a+)")
print(username) -- المخرج: Aliceهنا، الأقواس حول %a+ تخبر Lua بالتقاط تسلسل الأحرف الذي يأتي بعد "User: ". يساعد باقي النمط في تحديد الموقع الصحيح، ولكن يتم إرجاع الجزء الملتقط فقط.
إذا كان النمط الخاص بك يحتوي على عمليات التقاط متعددة، فإن string.match() تُرجعها جميعاً كقيم منفصلة، والتي يمكنك تعيينها لمتغيرات متعددة في وقت واحد.
التحدي
سهلاكتب دالة extractPrice تأخذ text وتعيد قيمة السعر الموجودة في السلسلة النصية.
استخدم string.match() مع نمط التقاط لاستخراج السعر الرقمي الذي يظهر بعد علامة الدولار. يجب أن يلتقط النمط رقماً واحداً أو أكثر باستخدام %d+.
المعاملات:
text(string): سلسلة نصية تحتوي على سعر بتنسيق "Price: $XX"
القيمة المرجعة: السعر الرقمي كسلسلة نصية (string)
ورقة مرجعية
استخدم string.match() لاستخراج النص الذي يطابق نمطاً معيناً:
local text = "Player score: 100"
local number = string.match(text, "%d+")
print(number) -- المخرجات: 100المعدل + يطابق حرفاً واحداً أو أكثر من فئة الأحرف السابقة:
%d+ -- رقم واحد أو أكثر
%a+ -- حرف واحد أو أكثراستخدم الأقواس () لإنشاء التقاطات (captures) تستخرج أجزاءً محددة من النمط:
local message = "User: Alice sent a message"
local username = string.match(message, "User: (%a+)")
print(username) -- المخرجات: Aliceالالتقاطات المتعددة تعيد قيماً منفصلة:
local var1, var2 = string.match(text, "(pattern1)(pattern2)")جرّب بنفسك
function extractPrice(text)
-- اكتب الكود هنا
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية4مقدمة إلى Metatables
ما هو الـ Metatable؟setmetatable و getmetatableالـ Metamethod المسماة __indexالـ Metamethod المسماة __newindexالـ Metamethod المسماة __tostringالـ Metamethods الحسابية - الجزء الأولالـ Metamethods الحسابية - الجزء الثانيملخص - جدول للقراءة فقط7معالجة النصوص المتقدمة
استخدام string.gsub() للاستبدالمقدمة في أنماط النصوصstring.find()string.match()التكرار باستخدام string.gmatch()مراجعة - محلل ملفات السجل2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج