English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

الخطوط بلغة Lua

النص أو السلسلة (String) هي سلسلة من الأحرف المكونة من الأرقام، والأحرف، وأشرطة السكين.

يمكن استخدام طرق ثلاثة لتمثيل النصوص في لغة Lua:

  • سلسلة من الأحرف بين الأقواس المزدوجة.

  • سلسلة من الأحرف بين الدوائر المزدوجة.

  • [[ مع ]] سلسلة من الأحرف.

أمثلة على الطرق الثلاثة للتعبير عن النصوص كما يلي:

string1 = "Lua"
print("\"النص 1 هو\"", string1)
string2 = 'oldtoolbag.com'
print("النص 2 هو", string2)
string3 = [["Lua	تعليمات"]]
print("النص 3 هو", string3)

نتيجة النص التالي هو:

"النص 1 هو" "Lua"
النص 2 هو "oldtoolbag.com"
النص 3 هو "Lua	تعليمات"

تستخدم الرموز الناتجة عن الاستبدال لتمثيل الأحرف التي لا يمكن عرضها مباشرة، مثل مفتاح التراجع، مفتاح التنفيس، وما إلى ذلك. على سبيل المثال، يمكن استخدام "\"" لتمثيل的双قوس في التحويل للنصوص.

جميع الرموز الناتجة عن الاستبدال ومجالاتها المتبادلة:

الرمز الناتج عن الاستبدال
المعنى
قيمة ASCII (عشري)
\a
الرنين (BEL)
007
\b
التراجع (BS) ، ينتقل الموقع الحالي إلى السطر السابق
008
\f
الانتقال إلى الصفحة التالية (FF) ، ينتقل الموقع الحالي إلى بداية الصفحة التالية
012
\n
التنفس (LF) ، ينتقل الموقع الحالي إلى بداية السطر التالي
010
\r
التنفيس (CR) ، ينتقل الموقع الحالي إلى بداية السطر
013
\t
التنسيق الأفقي (HT) (القفز إلى الموقع التالي للTAB)
009
\v
التنسيق العمودي (VT)
011
\\
تمثل حرف مزدوجة
092
\'
تمثل حرف مزدوجة
039
\"
تمثل حرف مزدوجة
034
\0
حرف فارغ (NULL)
000
\ddd
أي حرف تمثل قيمته من 1 إلى 3 عشرزري
ثلاثة عشرزري
\xhh
أي حرف تمثل قيمته من 1 إلى 2 بسطي عشري
بسطي عشري

عمليات النص

Lua يقدم العديد من الطرق لدعم عمليات النص:

الترتيبالطريقة والغرض
1string.upper(argument):
تحويل النص إلى أحرف كبيرة.
2string.lower(argument):
تحويل النص إلى أحرف صغيرة.
3string.gsub(mainString,findString,replaceString,num)

استبدال في النص

mainString هو النص الذي يتم معالجته، findString هو الحرف الذي يتم استبداله، replaceString هو الحرف الذي يتم استبداله به، num عدد المرات التي يتم استبدالها (يمكن تجاهله، يتم استبدال الكل). مثل:
> string.gsub("aaaa","a","z",3);
zzza    3
4string.find (str, substr, [init, [end]])
البحث عن محتوى معين في نص معين (المعلمة الثالثة هي مؤشر)، يعود بموقعها المحدد. إذا لم يوجد يعود nil.
> string.find("Hello Lua user", "Lua", 1) 
7    9
5string.reverse(arg)
عكس النص
> string.reverse("Lua")
auL
6string.format(...)
يعود بنوع نص مماثل لـ printf
> string.format("القيمة هي:%d",4)
القيمة هي:4
7string.char(arg) و string.byte(arg[,int])
char يتحول الرقم الصحيح إلى حرف ويتم الاتصال، byte يتحول الحرف إلى قيمة عددية (يمكن تحديد حرف معين، القيمة الافتراضية هي الحرف الأول).
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
>
8string.len(arg)
حساب طول النص.
string.len("abc")
3
9string.rep(string, n)
يعيد النص string بالنسخ n مرات
> string.rep("abcd",2)
abcdabcd
10..
ربط كلمتين
> print("www.w3codebox.".."com")
ar.oldtoolbag.com
11string.gmatch(str, pattern)
يعود بفونكشن تكراري،في كل مرة يتم استدعاؤه،يعود إلى النسخة التالية من النص str التي تتطابق مع وصف pattern. إذا لم يتم العثور على نص يتطابق مع pattern،يعود الفونكشن إلى nil.
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
12string.match(str, pattern, init)
string.match() يبحث فقط عن التطابق الأول في النص الأصلي str. المعلمة init اختيارية،تحدد نقطة البداية للبحث،افتراضياً 1.
عند التطابق الناجح،سيقوم الدالة بتقديم جميع النتائج المكتشفة في التعبير التطابق،إذا لم يتم تعيين علامة التقاطع،سيقوم بتقديم النص المكتقped بالكامل. عند عدم وجود تطابق ناجح،سيقوم بتقديم nil.
> = string.match("I have 2 questions for you.", "%d+ %a+")
2 questions
> = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
2, "questions"

قطع النصوص

استخدام طريقة sub() لقطع النصوص.

string.sub() يستخدم لقطع النصوص،نموذجها هو:

string.sub(s, i[, j])

شرح المعلمات:

  • s: النص الذي سيتم قطعه.

  • i: موقع البداية للقطع.

  • j: موقع النهاية للقطع،افتراضياً -1،حرف الأخير.

-- نص
local sourcestr = "prefix--w3codeboxgoogletaobao--suffix"
print("\nالنص الأصلي", string.format("%q", sourcestr))
-- استخراج جزء، من الأحرف 1 إلى 15
local first_sub = string.sub(sourcestr, 4, 15)
print("\nالاستخراج الأول", string.format("%q", first_sub))
-- استخراج الأحرف الأولية، من الأحرف 1 إلى 8
local second_sub = string.sub(sourcestr, 1, 8)
print("\nالاستخراج الثاني", string.format("%q", second_sub))
-- استخراج الأخيرة 10
local third_sub = string.sub(sourcestr, -10)
print("\nالاستخراج الثالث", string.format("%q", third_sub))
-- الإدخال خارج النطاق، عرض السلسلة الأصلية
local fourth_sub = string.sub(sourcestr, -100)
print("\nالاستخراج الرابع", string.format("%q", fourth_sub))

نتيجة تنفيذ الكود أعلاه هي:

السلسلة الأصلية "prefix--w3codeboxgoogletaobao--suffix"
الاستخراج الأول "fix--w3codeboxg"
الاستخراج الثاني "prefix--"
الاستخراج الثالث "ao--suffix"
الاستخراج الرابع "prefix--w3codeboxgoogletaobao--suffix"

تحويل الحروف الكبيرة والصغيرة للسلسلة

السلسلة التالية توضح كيفية تحويل الحروف الكبيرة والصغيرة للسلسلة:

string1 = "Lua";
print(string.upper(string1))
print(string.lower(string1))

نتيجة تنفيذ الكود أعلاه هي:

LUA
lua

البحث والإعكاس للسلسلة

السلسلة التالية توضح كيفية البحث والإعكاس للسلسلة:

string = "Lua Tutorial"
-- البحث في السلسلة
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("السلسلة الجديدة هي",reversedString)

نتيجة تنفيذ الكود أعلاه هي:

5 12
السلسلة الجديدة هي lairotuT auL

تنسيق النصوص

يقدم Lua دالة string.format() لإنشاء نصوص مformatted بناءً على تنسيق معين، يكون أول معامل له هو التنسيق، يتبعه بيانات مختلفة تتوافق مع كل رمز في التنسيق.

بسبب وجود نص التنسيق، يتم تحسين قابلية قراءة النصوص الطويلة بشكل كبير. يشبه هذا الدالة تنسيق printf() في لغة C.

تظهر الأمثلة التالية كيفية تنسيق النصوص:

قد تحتوي نص التنسيق على الرموز التالية:

  • %c - تقبل عددًا وتحويله إلى حرف يعادله في جدول ASCII

  • %d, %i - تقبل عددًا وتحويله إلى تنسيق عدد صحيح

  • %o - تقبل عددًا وتحويله إلى تنسيق عدد ثماني

  • 誃قبل عددًا وتحويله إلى تنسيق عدد صحيح

  • %x - تقبل عددًا وتحويله إلى تنسيق عدد عشري باستخدام الحروف الصغيرة

  • %X - تقبل عددًا وتحويله إلى تنسيق عدد عشري باستخدام الحروف الكبيرة

  • %e - تقبل عددًا وتحويله إلى تنسيق حساب علمي باستخدام الحرف الصغير e

  • %E - تقبل عددًا وتحويله إلى تنسيق حساب علمي باستخدام الحرف الكبير E

  • %f - تقبل عددًا وتحويله إلى تنسيق عدد عشري

  • %g(%G) - تقبل عددًا وتحويله إلى %e(%E، يتناسب مع %G) أو %f بناءً على التنسيق الأقصر

  • %q - تقبل نصًا وتحويله إلى تنسيق يمكن قراءته بشكل آمن من قبل معالج Lua

  • %s - تقبل نصًا وتنسيقه وفقًا للمعلمات المقدمة

لتحسين التنسيق بشكل دقيق، يمكن إضافة معلمات بعد رمز (%). سيتم قراءة المعلمات بالترتيب التالي:

  • (1) الرمز: علامة (+) واحدة تعني أن التحول التالي للعدد سيظهر الرمز الإيجابي. في الحالة الافتراضية، يتم عرض الرمز فقط للعدد السلبي.

  • (2) علامة المكان: 0 واحدة، تستخدم كحشو عند تحديد عرض النص. يتم استخدام حشو افتراضي هو الفراغ عند عدم إكمالها.

  • (3) إشارة التوجيه: عند تحديد عرض النص، تكون التوجيه الافتراضي إلى اليمين، وإضافة شرطة (-) يمكن تحويلها إلى التوجيه إلى اليسار.

  • (4) عدد العرض

  • (5) عدد أجزاء العدد/قطع النص: الجزء الصغير الذي يضاف بعد إضافة عدد العرض n، إذا كان يتبعه f (متحول عدد عشري، مثل%6.3f) فيضبط عدد العشري ليعرض فقط n موقعًا، وإذا كان يتبعه s (متحول نصي، مثل%5.3s) فيضبط النص ليعرض فقط n موقعًا.

string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- التنسيق الأساسي للنصوص
print(string.format("التنسيق الأساسي %s %s", string1, string2))
-- تشكيل التاريخ
date = 2; month = 1; year = 2014
print(string.format("تشكيل التاريخ %02d/%02d/%03d", date, month, year))
-- تشكيل العددي
print(string.format("%.4f", 1/3))

نتيجة تنفيذ الكود أعلاه هي:

تشكيل الأساسي Lua Tutorial
تشكيل التاريخ 02/01/2014
0.3333

أمثلة أخرى:

string.format("%c", 83)                 -- الناتجS
string.format("%+d", 17.0)              -- الناتج+17
string.format("%05d", 17)               -- الناتج00017
string.format("%o", 17)                 -- الناتج21
string.format("眻, 3.14)               -- الناتج3
string.format("%x", 13)                 -- الناتجd
string.format("%X", 13)                 -- الناتجD
string.format("%e", 1000)               -- الناتج1.000000e+03
string.format("%E", 1000)               -- الناتج1.000000E+03
string.format("%6.3f", 13)              -- الناتج13.000
string.format("%q", "One\nTwo")         -- الناتج"One\
                                        --   Two"
string.format("%s", "monkey")           -- الناتجmonkey
string.format("%10s", "monkey")         -- الناتج    monkey
string.format("%5.3s", "monkey")       -- الناتج    mon

تحويل الأحرف والأرقام المتبادلة

النموذج التوضيحي التالي يوضح كيفية تحويل الأحرف والأرقام المتبادلة:

-- 字符转换
-- تحويل الحرف الأول
print(string.byte("Lua"))
-- تحويل الحرف الثالث
print(string.byte("Lua", 3))
-- تحويل الحرف الأول
print(string.byte("Lua", -1))
-- الحرف الثاني
print(string.byte("Lua", 2))
-- تحويل الحرف الأخير
print(string.byte("Lua", -2))
-- تحويل رمز ASCII الصحيح إلى حرف
print(string.char(97))

نتيجة تنفيذ الكود أعلاه هي:

76
97
97
117
117
a

الوظائف الشائعة

في هذا المثال، يتم عرض عمليات نصية أخرى مثل حساب طول النص، ربط النصوص، نسخ النصوص، إلخ:

string1 = "www."
string2 = "w3codebox"
string3 = ".com"
-- استخدام .. لربط النصوص
print("ربط النص ", string1..string2..string3)
-- طول النص
print("طول النص ", string.len(string2))
-- نسخ النص 2 مرات
repeatedString = string.rep(string2, 2)
print(repeatedString)

نتيجة تنفيذ الكود أعلاه هي:

ربط النص ar.oldtoolbag.com
طول النص 5
w3codeboxw3codebox

نمط التطابق

نمط التطابق في Lua يتم وصفه باستخدام النص العادي. وهو يستخدم في وظائف التطابق string.find, string.gmatch, string.gsub, string.match.

يمكنك أيضًا استخدام النوع النصي في النمط

النوع النصي يشير إلى نمط يمكنه التطابق مع أي حرف في مجموعة معينة من الحروف. مثل، النوع النصي %d يُمكنك استخدامه في النمط %d%d/%d%d/%d%d%d%d لبحث عن أي عدد dd/mm/yyyy تاريخ بتنسيق:

s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date))) --> 30/05/1999

جدول التالي يوضح جميع أنواع الحروف المدعومة من Lua:

حرف واحد (إلا}} ^$()%.[]*+-? ): تطابق الرمز نفسه.

  • .(نقطة): تطابق أي رمز.

  • %a: تطابق أي حرف.

  • %c: تطابق أي رمز تحكم (مثل \n).

  • %d: تطابق أي رقم.

  • %l: تطابق أي حرف صغير.

  • %p: تطابق أي رمز نقاط علامات.

  • %s: تطابق أي رمز فراغ.

  • 縰ابق أي حرف كبير.

  • %w: تطابق أي حرف/رقم.

  • %x: تطابق أي عدد شiqri.

  • %z: تطابق أي رمز يمثل الصفر.

  • %x(هذا x هو رمز غير أبجدي وغير رقمي): تطابق الرمز x. يستخدم بشكل رئيسي لحل مشاكل مطابقة الرموز المميزة في التعبيرات (^[$()%.[]*+-?])، على سبيل المثال %% تطابق '%'.

  • [عدة فئات حروف]: تطابق أي فئة حروف موجودة في []، على سبيل المثال [%w_] تطابق أي حرف/رقم أو رمز خط أسفل (_).

  • [^عدة فئات حروف]: تطابق أي فئة حروف غير موجودة في []، على سبيل المثال [^%s] تطابق أي حرف غير فراغ.

عندما تُكتب فئات الحروف بالكتابة الكبيرة، فإنها تمثل مطابقة أي حرف غير منتمٍ لهذه الفئة. على سبيل المثال، %S يمثل مطابقة أي حرف غير فراغ. على سبيل المثال، '%A' غير الأبجدية:

> print(string.gsub("hello, up-down!", "%A", "."))
hello..up.down.    4

رقم 4 ليس جزءًا من نتيجة النص، إنه نتيجة gsub الثانية، يمثل عدد مرات التبديل.

هناك بعض الرموز الخاصة في مطابقة النمط، لديهم معاني خاصة، الرموز الخاصة في Lua كالتالي:

( ) . % + - * ? [ ^ $

'%' يستخدم كحرف فرار للرموز الخاصة، لذا '%.' يطابق النقطة؛'%%' يطابق الرمز '%'،. الرمز الفرار '%' يمكن أن يستخدم أيضًا لجميع الرموز غير الأبجدية.

يمكن أن يكون المدخل النموذجي:

  • فئة حرف واحدة تطابق أي حرف من هذا النوع في الفئة.

  • فئة حرف واحدة تتبع '*'، سيطابق صفرًا أو أكثر من هذا النوع. هذا المدخل دائمًا ما يطابق الأطول ممكنًا.

  • فئة حرف واحدة تتبع '+'، سيطابق واحدًا أو أكثر من هذا النوع. هذا المدخل دائمًا ما يطابق الأطول ممكنًا.

  • فئة حرف واحدة تتبع '-'، سيطابق صفرًا أو أكثر من هذا النوع. مختلف عن '*'، هذا المدخل دائمًا ما يطابق الأطول ممكنًا.

  • فئة حرف واحدة تتبع '?'، سيطابق صفرًا أو حرفًا واحدًا من هذا النوع. حيثما يكون ممكنًا، سيطابق واحدًا؛

  • %n، هذه n من 1 إلى 9؛ هذا المدخل يتطابق مع n الجزء من الكائن المكتشف (سيتم شرحه لاحقاً).

  • %bxy، هذه x و y هما حرفان واضحان؛ هذا العنصر يتطابق مع x البدء y الانتهاء وأنه x و y الحفاظ على التوازن في كل مرة يتم قراءتها من النص. يعني، إذا تم قراءة هذا النص من اليسار إلى اليمين، يتم قراءةx فإذا +1 ، إلى أن يتم قراءة y فإذا -1، الذي ينتهي في النهاية y هو الأول الذي يعد إلى y. على سبيل المثال، يمكن للعنصر %b() تطابق التعبير المتوازن بالأقواس.

  • %f[set]، يشير إلى نمط الحدود؛ هذا العنصر سيتم تطابقها مع موقع set قبل حرف في الداخل، وذلك الموقع السابق ليس له حرف ينتمي إلى set . الجمع set المعنى كما ذكر أعلاه. يتم حساب بداية ونهاية الفراغ الفارغ الذي يتم تطابق النص، وكأن هناك حرف في هذا المكان. مثل "\0".

النمط:

النمط يشير إلى سلسلة من عناصر النمط. بتضمين الرمز "^" في بداية النمط، يتم تحديد عملية التطابق من بداية النص. بتضمين الرمز "$" في نهاية النمط، يتم تحديد عملية التطابق إلى نهاية النص. إذا كانت "^" و "$" تظهر في أماكن أخرى، فإنها لا تحمل أي معنى خاص، بل تشير إلى نفسها.

الك捕获:

يمكن استخدام الأقواس الصغيرة للداخل لتشكيل أنماط فرعية؛ تسمى هذه الأنماط الك捕获ات. عند التطابق الناجح، يتم الك捕获ات يتم حفظ الأجزاء من النص التي تتوافق مع الك捕获ات لمستقبل استخدامها. يتم تسمية الك捕获ات بترتيب أزواجها المفتوحة. على سبيل المثال، بالنسبة للنمط "(a*(.)%w(%s*))"، جزء من النص الذي يتوافق مع "a*(.)%w(%s*)" يتم حفظه في الك捕获 الأول. ؛ الرموز التي تتوافق مع "." هي الرقم 2 من الك捕获ات، جزء من النص الذي يتناسب مع "%s*" هو الرقم 3.

كمثال استثنائي، سيقوم الك捕获 الفارغ () بالقبض على موقع النص الحالي (وهو رقم). على سبيل المثال، إذا تم تطبيق النمط "()aa()" على النص "flaaap"، ستنتج اثنتان من الك捕获ات: 3 و 5.