العثور على السلاسل الفرعية واستخراجها
طبّق string.find وstring.sub لتحديد النص واستخراجه
العثور على السلاسل الفرعية واستخراجها درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
أساسيات string.find
تبحث string.find(s, pattern, init, plain) عن نمط في s بدءًا من init (وقيمته الافتراضية 1). وتُرجع موضعي البداية والنهاية للتطابق، أو nil إذا لم تعثر عليه. عند استخدام plain=true، تتعامل مع النمط كسلسلة نصية حرفية (من دون محارف خاصة).
local s = "hello world"
local i, j = string.find(s, "world")
print(i, j) -- 7 11
-- Plain search (literal string)
local i2, j2 = string.find("a+b=5", "+", 1, true)
print(i2, j2) -- 2 2
-- Not found
print(string.find(s, "xyz")) -- nilاستخدام string.sub للاستخراج
تستخرج string.sub(s, i, j) السلسلة الفرعية من الموضع i إلى الموضع j (شاملًا). تحسب الفهارس السالبة من النهاية؛ إذ يشير -1 إلى المحرف الأخير. إذا لم تُحدَّد j، فقيمتها الافتراضية هي نهاية السلسلة.
local s = "hello world"
print(string.sub(s, 1, 5)) -- hello
print(string.sub(s, 7)) -- world
print(string.sub(s, -5)) -- world
print(string.sub(s, 1, -7)) -- hello
print(s:sub(7, 11)) -- world (method syntax)دمج find وsub
ادمج string.find وstring.sub لتحديد السلاسل الفرعية واستخراجها. ابحث أولًا عن الفاصل، ثم استخرج الأجزاء الموجودة على جانبيه. هذه هي الطريقة الأساسية لتقسيم السلاسل النصية.
local s = "key=value"
local i = string.find(s, "=")
if i then
local key = string.sub(s, 1, i - 1)
local val = string.sub(s, i + 1)
print(key, val) -- key value
endاستخدام string.match لالتقاط الأنماط
تُرجع string.match(s, pattern, init) السلاسل الفرعية الملتقطة التي تطابق النمط. إذا لم يتضمن النمط أي عمليات التقاط، فإنها تُرجع التطابق الكامل. وإذا لم يحدث أي تطابق، فإنها تُرجع nil. تُحدَّد عمليات الالتقاط باستخدام الأقواس في النمط.
local date = "2024-03-15"
local y, m, d = string.match(date, "(%d+)-(%d+)-(%d+)")
print(y, m, d) -- 2024 03 15
-- No capture: returns the whole match
local num = string.match("price: 42.5 USD", "%d+%.%d+")
print(num) -- 42.5العثور على آخر ظهور
للعثور على آخر ظهور لسلسلة فرعية، ابحث باستخدام حلقة تزيد موضع البداية، أو ابحث بدءًا من النهاية. الطريقة المعتادة هي الاستمرار في استدعاء string.find باستخدام الموضع الذي يلي التطابق السابق مباشرةً، إلى أن تُرجع nil.
local function findLast(s, sub)
local last_i, last_j
local i, j = string.find(s, sub, 1, true)
while i do
last_i, last_j = i, j
i, j = string.find(s, sub, j + 1, true)
end
return last_i, last_j
end
local i, j = findLast("a/b/c/d", "/")
print(i, j) -- 6 6استخراج امتدادات الملفات
من الاستخدامات العملية لـ string.match استخراج امتداد اسم ملف. يلتقط النمط "([^%.]+)$" آخر تسلسل لا يحتوي على نقطة في نهاية السلسلة، أو استخدم "%.([^%.]+)$" لالتقاط النص الذي يلي آخر نقطة فقط.
local function getExt(filename)
return string.match(filename, "%.([^%.]+)$")
end
print(getExt("photo.jpg")) -- jpg
print(getExt("archive.tar.gz")) -- gz
print(getExt("README")) -- nil
print(getExt("config.lua.bak")) -- bakتقسيم السلاسل النصية
لا توفر Lua دالة مضمّنة لتقسيم السلاسل النصية، لكن يمكنك تنفيذها باستخدام string.gmatch. كرّر على جميع التسلسلات التي لا تحتوي على الفاصل، أو استخدم نمطًا يلتقط النص الواقع بين الفواصل.
local function split(s, sep)
local result = {}
local pattern = "([^" .. sep .. "]+)"
for part in string.gmatch(s, pattern) do
result[#result+1] = part
end
return result
end
local parts = split("one,two,three,four", ",")
for i, p in ipairs(parts) do
print(i, p)
end
-- 1 one 2 two 3 three 4 fourإزالة المسافات البيضاء
أزل المسافات البيضاء في بداية السلسلة ونهايتها من خلال مطابقتها والتخلص منها. يستخدم النمط "^%s*(.-)%s*$" محدِّدًا كسولًا .- لالتقاط أقل محتوى ممكن بين المسافات الاختيارية في البداية والنهاية.
local function trim(s)
return string.match(s, "^%s*(.-)%s*$")
end
print("|" .. trim(" hello ") .. "|") -- |hello|
print("|" .. trim(" \t\n") .. "|") -- ||
print("|" .. trim("no spaces") .. "|") -- |no spaces|استخراج الأرقام من النص
استخدم string.gmatch مع نمط للأرقام لاستخراج جميع الأرقام من سلسلة نصية. يطابق النمط %-?%d+%.?%d* إشارة السالب الاختيارية، ثم الأرقام، ثم الفاصلة العشرية الاختيارية، ثم مزيدًا من الأرقام.
local text = "Revenue: $1,234.56 Expenses: $567.89 Net: $666.67"
local numbers = {}
for n in string.gmatch(text, "%d+%.?%d*") do
numbers[#numbers+1] = tonumber(n)
end
for _, v in ipairs(numbers) do
io.write(v .. " ")
end
print() -- 1 234.0 56.0 567.89 666.67توحيد مواضع السلاسل النصية
تتيح لك الفهارس السالبة في Lua العمل انطلاقًا من نهاية السلسلة النصية. تحصل string.sub(s, -n) على آخر n من المحارف. ادمجها مع #s لحساب المواضع. يساعد فهم العلاقة بين الفهارس الموجبة والسالبة على تجنب أخطاء تجاوز الموضع.
local s = "abcdefgh"
-- Last 3 characters
print(s:sub(-3)) -- fgh
-- All but last 2
print(s:sub(1, -3)) -- abcdef
-- Character at position from end
print(s:sub(-1, -1)) -- h
print(s:sub(-4, -2)) -- efgتحقق سريع
ماذا تُرجع string.sub("hello", 2, -2)؟
مراجعة: البحث والاستخراج
الملخص:
string.find(s, pat, init, plain)— تُرجع البداية والنهاية أو nilstring.sub(s, i, j)— استخراج حسب الموضع؛ الفهارس السالبة تُحسب من النهايةstring.match(s, pat)— تُرجع عمليات الالتقاط أو التطابق الكامل- استخدم
plain=trueللبحث الحرفي (من دون محارف خاصة) - نفّذ التقسيم باستخدام
string.gmatch - لإزالة المسافات البيضاء: النمط
"^%s*(.-)%s*$"
الأسئلة الشائعة
هل درس «العثور على السلاسل الفرعية واستخراجها» مجاني؟
نعم — نص درس «العثور على السلاسل الفرعية واستخراجها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «العثور على السلاسل الفرعية واستخراجها»؟
طبّق string.find وstring.sub لتحديد النص واستخراجه تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «العثور على السلاسل الفرعية واستخراجها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات السلاسل النصية: الربط والطول
- العثور على السلاسل الفرعية واستخراجها
- string.format لإخراج النصوص
- string.gsub وstring.gmatch