0Pricing
Lua Academy · درس

‏string.gsub وstring.gmatch

استبدل مطابقات الأنماط في السلاسل النصية وكرّر عبرها

‏string.gsub وstring.gmatch درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

أساسيات string.gsub

تستبدل string.gsub(s, pattern, repl, n) التطابقات مع pattern في s باستخدام repl، بحد أقصى n مرات (والقيمة الافتراضية: الكل). وتُرجع السلسلة الناتجة وعدد عمليات الاستبدال التي أُجريت. يمكن أن يكون الاستبدال سلسلة نصية أو جدولًا أو دالة.

local s = "hello world hello"
local result, count = string.gsub(s, "hello", "hi")
print(result)  -- hi world hi
print(count)   -- 2

-- Limit replacements
local r2 = string.gsub(s, "hello", "hi", 1)
print(r2)      -- hi world hello

مراجع الالتقاط في الاستبدال

تشير %1 و%2 وما إلى ذلك في سلسلة الاستبدال إلى عمليات الالتقاط في النمط. ويشير %0 إلى التطابق الكامل. استخدم ذلك لإعادة ترتيب النص المطابق أو إحاطته.

-- Swap first and last name
local name = "Smith, John"
local swapped = string.gsub(name, "(%a+), (%a+)", "%2 %1")
print(swapped)   -- John Smith

-- Wrap numbers in brackets
local text = "items: 3 and 7 total 10"
local tagged = string.gsub(text, "%d+", "[%0]")
print(tagged)    -- items: [3] and [7] total [10]

الدالة كبديل

عندما يكون الاستبدال دالة، تستدعيها gsub مع كل تطابق (أو مع عمليات الالتقاط)، وتستخدم القيمة التي تُرجعها كاستبدال. أعد nil أو false للإبقاء على التطابق الأصلي. يتيح ذلك إجراء استبدالات ديناميكية محسوبة.

local env = {NAME="Lua", VERSION="5.4"}
local template = "Welcome to $NAME version $VERSION!"
local result = string.gsub(template, "%$(%w+)", env)
print(result)   -- Welcome to Lua version 5.4!

-- Double each number
local s = "a1 b2 c3"
local r = string.gsub(s, "%d+", function(n)
  return tostring(tonumber(n) * 2)
end)
print(r)  -- a2 b4 c6

الجدول كبديل

عندما يكون الاستبدال جدولًا، تبحث gsub عن كل تطابق (أو عن الالتقاط الأول) في الجدول، وتستخدم النتيجة. إذا أعاد البحث nil أو false، يُحافَظ على التطابق الأصلي. وهذا مثالي لقواميس الاستبدال.

local abbreviations = {
  str = "string",
  num = "number",
  tbl = "table",
  fn  = "function",
}

local text = "A str can hold a num or a tbl"
local expanded = string.gsub(text, "%a+", abbreviations)
print(expanded)
-- A string can hold a number or a table

أساسيات string.gmatch

تُرجع string.gmatch(s, pattern) مكرّرًا على جميع التطابقات مع pattern في s. ويُرجع كل استدعاء للمكرّر التطابق التالي (أو عمليات الالتقاط إذا كان النمط يتضمنها). وهذه هي الطريقة الاصطلاحية للتكرار على التطابقات في Lua.

local s = "one=1 two=2 three=3"

-- Iterate all words
for word in string.gmatch(s, "%a+") do
  io.write(word .. " ")
end
print()  -- one two three

-- Iterate key=value pairs
for k, v in string.gmatch(s, "(%a+)=(%d+)") do
  print(k, v)
end

تقسيم الرموز باستخدام gmatch

استخدم string.gmatch لتقسيم الإدخال إلى رموز: فقسّمه حسب المسافات البيضاء، أو حلّل صفوف CSV، أو استخرج بيانات منظمة. يحدد النمط ما يجب التقاطه، بينما يُعامل كل ما عداه كفاصل.

-- Split by whitespace
local function tokenize(s)
  local tokens = {}
  for token in string.gmatch(s, "%S+") do
    tokens[#tokens+1] = token
  end
  return tokens
end

local toks = tokenize("  hello   world   lua  ")
for i, t in ipairs(toks) do
  print(i, t)
end
-- 1 hello  2 world  3 lua

تحليل معاملات URL

حلّل سلاسل الاستعلام بالتكرار على أزواج المفتاح والقيمة. يلتقط النمط ([^&=]+)=([^&]+) كل مفتاح وقيمة يفصل بينهما =، وتقع الأزواج بين فواصل &.

local url_params = "name=Alice&age=30&city=Istanbul"
local params = {}

for key, value in string.gmatch(url_params, "([^&=]+)=([^&]*)") do
  params[key] = value
end

print(params.name)  -- Alice
print(params.age)   -- 30
print(params.city)  -- Istanbul

إزالة وسوم HTML

من مهام معالجة النصوص الشائعة إزالة وسوم HTML من سلسلة نصية. استخدم string.gsub مع نمط يطابق وسوم الفتح والإغلاق، واستبدلها بسلسلة نصية فارغة.

local html = "<h1>Hello</h1> <p>World <b>bold</b></p>"
local plain = string.gsub(html, "<[^>]+>", "")
print(plain)   -- Hello  World bold

-- Replace <br> with newline
local html2 = "line1<br>line2<br/>line3"
local fixed = string.gsub(html2, "<br/?>", "\n")
print(fixed)

إلغاء محارف الأنماط الخاصة

محارف الأنماط الخاصة في Lua هي: . + * ? [ ] ^ $ % ( ). لمطابقتها حرفيًا، أسبقها بمحرف الهروب %. وعند استخدام سلاسل نصية عادية تتضمن هذه المحارف، مرّر true باعتباره الوسيط الرابع إلى string.find لتعطيل مطابقة الأنماط.

-- Escape a string for use in a pattern
local function escapePattern(s)
  return (string.gsub(s, "[%(%)%.%%%+%-%*%?%[%^%$]", "%%%1"))
end

local query = "1+1=2"
local pattern = escapePattern(query)
print(string.find("result: 1+1=2", pattern, 1))  -- 9  13

عدّ مرات الظهور

استخدم قيمة الإرجاع الثانية من string.gsub (عدد عمليات الاستبدال) لعدّ مرات ظهور نمط في سلسلة نصية، حتى من دون إجراء أي استبدال.

local text = "banana"
local _, count = string.gsub(text, "a", "")
print("'a' appears " .. count .. " times")  -- 3

-- Count words
local sentence = "the quick brown fox"
local _, wordCount = string.gsub(sentence, "%S+", "")
print("Words:", wordCount)  -- 4

تحقق سريع

ماذا تُرجع string.gsub("hello", "l", "L")؟

مراجعة: gsub وgmatch

الملخص:

  • gsub(s, pat, repl, n) — استبدال؛ ويمكن أن يكون repl سلسلة نصية أو جدولًا أو دالة
  • تشير %1...%n في سلاسل الاستبدال إلى عمليات الالتقاط
  • gmatch(s, pat) — التكرار على جميع التطابقات
  • استخدم % لإلغاء محارف النمط الخاصة: %. و%+ وغيرهما
  • عدّ مرات الظهور: قيمة الإرجاع الثانية من gsub

الأسئلة الشائعة

هل درس «‏string.gsub وstring.gmatch» مجاني؟

نعم — نص درس «‏string.gsub وstring.gmatch» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏string.gsub وstring.gmatch»؟

استبدل مطابقات الأنماط في السلاسل النصية وكرّر عبرها تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «‏string.gsub وstring.gmatch»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

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