0Pricing
Lua Academy · درس

العثور على السلاسل الفرعية واستخراجها

طبّق 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) — تُرجع البداية والنهاية أو nil
  • string.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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات السلاسل النصية: الربط والطول
  2. العثور على السلاسل الفرعية واستخراجها
  3. ‏string.format لإخراج النصوص
  4. ‏string.gsub وstring.gmatch
← العودة إلى Lua Academy