نوع بيانات السلسلة هو تسلسل من الأحرف، مثل الحروف والأرقام والرموز. إنه نوع البيانات لتخزين معظم المعلومات النصية.
إعلان السلاسل
لإعلان عن متغير سلسلة، ضع علامات الاقتباس حول الأحرف. من الأكثر شيوعًا استخدام علامات الاقتباس المزدوجة (")، ولكن علامات الاقتباس المفردة (') تعمل أيضًا. إذا كنت تريد تضمين علامة اقتباس مفردة أو مزدوجة في سلسلتك، فقم بإحاطة سلسلتك بنوع الاقتباس الآخر، أو استخدم اقتباس مهرب.
local string1 = "مرحبا بالعالم!"print(string1) --> مرحبا بالعالم!local string2 = 'مرحبا "بالعالم"!'print(string2) --> مرحبا "بالعالم"!
لتضمين كل من علامات الاقتباس المفردة والمزدوجة في سلسلة، أو لإنشاء سلاسل متعددة الأسطر، قم بالإعلان عنها باستخدام أقواس مزدوجة:
local string1 = [[مرحبابالعالم!مرحبا "بالعالم"!مرحبا 'بالعالم'!]]print(string1)--> مرحبا--> بالعالم!--> مرحبا "بالعالم"!--> مرحبا 'بالعالم'!
إذا لزم الأمر، يمكنك تضمين أقواس متعددة داخل سلسلة باستخدام نفس عدد علامات المساواة في كل من القوس الأول والأخير:
local string1 = [=[مرحبا[[بالعالم!]]]=]print(string1)--> مرحبا--> [[بالعالم!]]
دمج السلاسل
لدمج السلاسل، قم بـ ربطها بنقطتين (..). ربط السلاسل لا يدرج فراغاً بينها، لذا ستحتاج إلى تضمين فراغات في نهاية/بداية سلسلة سابقة/لاحقة، أو ربط فراغ بين السلسلتين.
local hello = "مرحبا"local helloWithSpace = "مرحبا "local world = "بالعالم!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> مرحبًا بالعالم!print(string2) --> مرحبا بالعالم!print(string3) --> مرحبا بالعالم!
لاحظ أن أمر print() يأخذ عدة معطيات ويمزجها مع مسافات، لذا يمكنك استخدام ، بدلاً من .. للحصول على مسافات في مخرجات print().
local hello = "مرحبا"local world = "بالعالم"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> مرحبا بالعالم!print(hello, world .. exclamationMark) --> مرحبا بالعالم!print(hello, world, exclamationMark) --> مرحبا بالعالم!
تحويل السلاسل
لتحويل سلسلة إلى رقم، استخدم دالة tonumber(). إذا كانت السلسلة لا تحتوي على تمثيل رقمي، فترجع tonumber() nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "مرحبا123"print(tonumber(alphanumericString)) --> nil
اقتباسات السلاسل
للهروب من علامة اقتباس مزدوجة أو مفردة في إعلان سلسلة وتضمين أي حرف تقريبًا، ضع شرطة مائلة (\) قبل الحرف. على سبيل المثال:
- لتضمين علامة اقتباس مفردة في سلسلة محددة بعلامات اقتباس مفردة، استخدم \'.
- لتضمين علامة اقتباس مزدوجة في سلسلة محددة بعلامات اقتباس مزدوجة، استخدم \".
local string1 = 'مرحبا \'بالعالم\'!'print(string1) --> مرحبا 'بالعالم'!local string2 = "مرحبا \"بالعالم\"!"print(string2) --> مرحبا "بالعالم"!
بعض الأحرف التي تأتي بعد الشرائط المائلة تنتج أحرف خاصة بدلاً من الأحرف الهاربة:
- لتضمين سطر جديد، استخدم \n.
- لتضمين علامة تبويب أفقية، استخدم \t.
local string1 = "مرحبا\nبالعالم!"print(string1)--> مرحبا--> بالعالم!local string2 = "مرحبا\tبالعالم!"print(string2) --> مرحبا بالعالم!
إدراج السلاسل
يدعم Luau إدراج السلاسل، وهي ميزة تتيح لك إدراج تعبيرات في السلاسل. استخدم الأشرطة الخلفية (`) لإعلان سلسلة مدرجة، ثم أضف التعبيرات داخل الأقواس المعقوفة:
local world = "بالعالم"local string1 = `مرحبا {world}!`print(string1) --> مرحبا بالعالم!
على الرغم من أن المتغيرات هي الاستخدام الأكثر شيوعًا، يمكنك استخدام أي تعبير، بما في ذلك العمليات الرياضية:
local world = "بالعالم"local number = 1local letters = {"ب", "ع", "ا", "ل", "م"}local string1 = `مرحبا {world}, {number} مرة!`local string2 = `مرحبا {world}, {number + 1} مرات!`local string3 = `مرحبا {table.concat(letters)} مرة ثالثة!`print(string1) --> مرحبا بالعالم، 1 مرة!print(string2) --> مرحبا بالعالم، 2 مرات!print(string3) --> مرحبا بالعالم مرة ثالثة!
تطبق قواعد الهروب القياسية على الأشرطة الخلفية، والأقواس المعقوفة، والشرائط المائلة:
local string1 = `مرحبا \`\{world\}\`!`print(string1) --> مرحبا `{world}`!
تحويل رياضي
إذا قمت بإجراء عمليات رياضية على سلسلة، فإن Luau يقوم تلقائيًا بتحويل السلسلة إلى رقم. إذا كانت السلسلة لا تحتوي على تمثيل رقمي، يحدث خطأ.
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("مرحبا" + 10) --> print("مرحبا" + 10):1: attempt to perform arithmetic (add) on string and number
المقارنات
يمكن مقارنة السلاسل باستخدام العمليات <، <=، > و >= التي تقارن باستخدام ترتيب قوامي بناءً على رموز ASCII لكل حرف في سلسلة. سوف ينتج عن ذلك عدم مقارنة الأرقام في السلاسل بشكل صحيح، على سبيل المثال، "100" ستكون أقل من "20"، حيث إن بايتات "0" و "1" لها رموز ASCII أقل من بايت "2".
print("تفاح" < "تفاحه") --> trueprint("موز" < "تفاحه") --> true (م هو قبل ا في ASCII)print("رقم100" < "رقم20") --> true
مرجع نمط السلسلة
نمط السلسلة هو مزيج من الأحرف يمكنك استخدامه مع string.match()، string.gmatch()، ووظائف أخرى للبحث عن قطعة، أو جزء فرعي، من سلسلة أطول.
المطابقات المباشرة
يمكنك استخدام المطابقات المباشرة في دالة Luau مثل string.match()، باستثناء الأحرف السحرية. على سبيل المثال، هذه الأوامر تبحث عن الكلمة Roblox داخل سلسلة:
local match1 = string.match("مرحبًا بكم في Roblox!", "Roblox")local match2 = string.match("مرحبًا بكم في لعبتي الرائعة!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
فئات الحروف
فئات الحروف ضرورية للبحث عن السلاسل الأكثر تقدمًا. يمكنك استخدامها للبحث عن شيء ليس بالضرورة متحديد بحرف معين ولكن يندرج ضمن فئة معروفة (فئة)، بما في ذلك الحروف، الأرقام، المسافات، علامات الترقيم، والمزيد.
توضح الجدول التالي فئات الحروف الرسمية لأنماط سلاسل Luau:
| فئة | تمثل | مثال للمطابقة |
|---|---|---|
| . | أي حرف | 32kasGJ1%fTlk?@94 |
| %a | حرف كبير أو صغير | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
| %l | حرف صغير | abcdefghijklmnopqrstuvwxyz |
| %u | حرف كبير | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| %d | أي رقم (عدد) | 0123456789 |
| %p | أي حرف علامات ترقيم | !@#;,. |
| %w | حرف أبجدي رقمي (إما حرف أو رقم) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
| %s | مسافة أو حرف مسافة فارغة | ، \n، و \r |
| %c | حرف تحكم خاص control character | |
| %x | حرف سداسي عشري | 0123456789ABCDEF |
| %z | حرف NULL (\0) |
بالنسبة لفئات الحروف ذات الحرف الواحد مثل %a و %s، يمثل الحرف الكبير المقابل "النوع المعاكس" للفئة. على سبيل المثال، %p يمثل حرف علامة الترقيم بينما %P يمثل جميع الحروف باستثناء علامات الترقيم.
الأحرف السحرية
هناك 12 "حرف سحري" محجوز لأغراض خاصة في الأنماط:
| $ | % | ^ | * | ( | ) |
| . | [ | ] | + | - | ? |
يمكنك الهروب والبحث عن الأحرف السحرية باستخدام الرمز %. على سبيل المثال، للبحث عن roblox.com، قم بهروب رمز . (النقطة) من خلال وضع % أمامه كما في %..
-- "roblox.com" يناسب "roblox#com" لأن النقطة تفسر على أنها "أي حرف"local match1 = string.match("ما هو roblox#com؟", "roblox.com")print(match1) --> roblox#com-- اهرب من النقطة باستخدام % بحيث تُفسر على أنها حرف نقطة حرفيlocal match2 = string.match("أنا أحب roblox.com!", "roblox%.com")print(match2) --> roblox.com
المثبتات
يمكنك البحث عن نمط في بداية أو نهاية سلسلة باستخدام الرمزين ^ و $.
local start1 = string.match("الأول الثاني الثالث", "^الأول") -- يناسب لأن "الأول" في البدايةprint(start1) --> الأولlocal start2 = string.match("الثالث الثاني الأول", "^الأول") -- لا يناسب لأن "الأول" ليس في البدايةprint(start2) --> nillocal end1 = string.match("الأول الثاني الثالث", "الثالث$") -- يناسب لأن "الثالث" في النهايةprint(end1) --> الثالثlocal end2 = string.match("الثالث الثاني الأول", "الثالث$") -- لا يناسب لأن "الثالث" ليس في النهايةprint(end2) --> nil
يمكنك أيضًا استخدام كليهما ^ و $ معًا لضمان أن النمط يناسب السلسلة الكاملة وليس مجرد جزء منها.
-- باستخدام كل من ^ و $ لمطابقة عبر سلسلة كاملةlocal match1 = string.match("Roblox", "^Roblox$") -- يناسب لأن "Roblox" هو السلسلة الكاملة (التساوي)print(match1) --> Robloxlocal match2 = string.match("ألعب Roblox", "^Roblox$") -- لا يناسب لأن "Roblox" ليس في البداية AND النهايةprint(match2) --> nillocal match3 = string.match("ألعب Roblox", "Roblox") -- يناسب لأن "Roblox" موجودة داخل "ألعب Roblox"print(match3) --> Roblox
المعدلات الفئوية
بحد ذاتها، فئة الحرف تتطابق فقط مع حرف واحد في سلسلة. على سبيل المثال، النمط التالي ("%d") يبدأ في قراءة السلسلة من اليسار إلى اليمين، ويعثر على أول رقم (2)، ثم يتوقف.
local match = string.match("مملكة السحاب لديها 25 جوهرة طاقة", "%d")print(match) --> 2
يمكنك استخدام معدلات مع أي فئة حرف للتحكم في النتيجة:
| المعدّل | المعنى |
|---|---|
| + | مطابقة 1 أو أكثر من فئة الحرف السابقة |
| - | مطابقة أقل ما يمكن من فئة الحرف السابقة |
| * | مطابقة 0 أو أكثر من فئة الحرف السابقة |
| ? | مطابقة 1 أو أقل من فئة الحرف السابقة |
| %n | لـ n بين 1 و 9، تطابق جزء فرعي يساوي n السلسلة الملتقطة. |
| %bxy | المطابقة المتوازنة التي تطابق x، y، وكل شيء بينهما (على سبيل المثال، %b() تطابق زوج من الأقواس وكل شيء بينها) |
إضافة معدل إلى نفس النمط ("%d+" بدلاً من "%d")، ينتج 25 بدلاً من 2:
local match1 = string.match("مملكة السحاب لديها 25 جوهرة طاقة", "%d")print(match1) --> 2local match2 = string.match("مملكة السحاب لديها 25 جوهرة طاقة", "%d+")print(match2) --> 25
مجموعات الفئات
يجب استخدام المجموعات عندما لا تستطيع فئة حرف واحدة القيام بكل الوظيفة. على سبيل المثال، قد ترغب في مطابقة كل من الحروف الصغيرة (%l) وعلامات الترقيم (%p) باستخدام نمط واحد.
تُعرف المجموعات بواسطة الأقواس [] حولها. في المثال التالي، لاحظ الفرق بين استخدام مجموعة ("[%l%p]+") و عدم استخدام مجموعة ("%l%p+").
local match1 = string.match("مرحبًا!!! أنا سلسلة أخرى.", "[%l%p]+") -- مجموعةprint(match1) --> مرحبًا!!!local match2 = string.match("مرحبًا!!! أنا سلسلة أخرى.", "%l%p+") -- غير مجموعةprint(match2) --> ر!!!
الأمر الأول (المجموعة) يخبر Luau للعثور على كل من الحروف الصغيرة وعلامات الترقيم. مع إضافة المعدل + بعد المجموعة بأكملها، يجد كل تلك الأحرف (مرحبًا!!!)، ويتوقف عندما يصل إلى المسافة.
في الأمر الثاني (غير المجموعة)، ينطبق المعدل + فقط على فئة %p التي قبلها، لذا فإن Luau يلتقط فقط أول حرف صغير (ر) قبل سلسلة علامات الترقيم (!!!).
مثل فئات الحروف، يمكن أن تكون المجموعات "معاكسة" لأنفسها. يتم ذلك بإضافة حرف ^ في بداية المجموعة، مباشرة بعد الأقواس الافتتاحية [. على سبيل المثال، "[%p%s]+" تمثل كل من علامات الترقيم والمسافات، بينما "[^\p%s]+" تمثل جميع الأحرف باستثناء علامات الترقيم والمسافات.
تدعم المجموعات أيضًا المدى التي تتيح لك العثور على مجموعة كاملة من المطابقات بين حرف بداية ونهاية. هذه ميزة متقدمة يتم توضيحها بمزيد من التفصيل في دليل Lua 5.1.
التقاط السلسلة
الالتقاطات في السلسلة هي أنماط فرعية ضمن نمط. هذه محاطة بأقواس () وتستخدم للحصول (لتقจับ) جزئيات المطابقة وحفظها في متغيرات. على سبيل المثال، يحتوي النمط التالي على تقاطين، (%a+) و (%d+)، اللتان ترجعان جزئين upon match ناجح.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("واحد وعشرون = 21", pattern)print(key1, val1) --> واحد وعشرون 21local key2, val2 = string.match("ألفي= 2000", pattern)print(key2, val2) --> ألفي 2000local key3, val3 = string.match("مليون=1000000", pattern)print(key3, val3) --> مليون 1000000
تعتبر الكمية ? التي تتبع كل من كلاس %s إضافة آمنة لأنها تجعل المسافة في كل من جانبي علامة = اختيارية. هذا يعني أن المطابقة تنجح إذا كانت إحدى المسافتين (أو كلاهما) مفقودة حول علامة المساواة.
في دالة string.gsub()، يمكنك تضمين مجموعات الالتقاط في سلسلة الاستبدال باستخدام %1، %2، %3، وما إلى ذلك، حتى %9. على الرغم من أن Luau يدعم حتى 32 مجموعة التقاط قبل أن يحدث خطأ، إلا أنه يمكنك فقط الإشارة إلى التسعة الأولى بهذه الصيغة:
local str = "حب2العب Roblox"local pattern = "(%w+)(%d+)(%w+)%s+(%w+)"local replacement = "أنا %1 %2 %3 %4!"local result = string.gsub(str, pattern, replacement)print(result) --> أنا حب 2 العب Roblox!
يمكنك أيضًا تعشيق التقاطات السلسلة:
local places = "مملكة السحاب رائعة، مملكة الغابة سلمية"local pattern = "(الحب%s(%a+%sKingdom)[%w%s]+)"for description, kingdom in string.gmatch(places, pattern) doprint(description)print(kingdom)end--> مملكة السحاب رائعة--> مملكة السحاب--> مملكة الغابة سلمية--> مملكة الغابة
تعمل عملية البحث هذه كما يلي:
تبحث المكرر string.gmatch() عن مطابقة على النمط الكامل "الوصف" المحدد بواسطة أزواج الأقواس الخارجية. يتوقف هذا عند الفاصلة الأولى ويلتقط ما يلي:
| # | النمط | الالتقاط |
|---|---|---|
| 1 | (الحب%s(%a+%sKingdom)[%w%s]+) | مملكة السحاب رائعة |
باستخدام الالتقاط الأول الناجح، يبحث المكرر مرة أخرى عن مطابقة على "مملكة" بالنمط الذي حددته الأزواج الداخلية من الأقواس. يلتقط هذا النمط المتداخل ببساطة ما يلي:
| # | النمط | الالتقاط |
|---|---|---|
| 2 | (%a+%sKingdom) | مملكة السحاب |
ثم يعود المكرر ويستمر في البحث في السلسلة الكاملة، ملتقطًا ما يلي:
| # | النمط | الالتقاط |
|---|---|---|
| 3 | (الحب%s(%a+%sKingdom)[%w%s]+) | مملكة الغابة سلمية |
| 4 | (%a+%sKingdom) | مملكة الغابة |
بالإضافة إلى كل ما سبق، هناك حالة خاصة مع التقاط فارغ (()). إذا كان الالتقاط فارغًا، فسيتم التقاط الموقع في السلسلة:
local match1 = "أين يحدث الالتقاط؟ من يدري!"local match2 = "هذه السلسلة أطول من الأولى. أين يحدث الالتقاط؟ من يدري؟!"local pattern = "()أين يحدث الالتقاط%؟ من يدري!()"local start1, finish1 = string.match(match1, pattern)print(start1, finish1) --> 1 42local start2, finish2 = string.match(match2, pattern)print(start2, finish2) --> 43 84
يمكن أن يتم تعشيق هذه الالتقاطات الخاصة مثل العادية:
local places = "مملكة السحاب رائعة، مملكة الغابة سلمية."local pattern = "مملكة (%a+()) ملك المملكة"for kingdom, position in string.gmatch(places, pattern) doprint(kingdom, position)end--> رائعة 10--> سلمية 42
تكون القيم المرجعة غير عادية لأنها أرقام بدلاً من سلاسل:
local match = "هذه مثال"local pattern = "هذه ()مثال"local position = string.match(match, pattern)print(typeof(position)) --> رقم