هاها، لنبدأ ببضع كلمات. في العام الماضي استخدمت لغة C# لإنشاء أداة لتسليط الضوء على بناء الجملة. لقد قامت بتنسيق التعليمات البرمجية المحددة في HTML بناءً على المعلومات الموجودة في ملف التكوين، بحيث يمكنها عرض نفس بناء الجملة على صفحة الويب. في المحرر، تسليط الضوء على تأثير العنصر ودعم طي التعليمات البرمجية. هذا صحيح، إنه مشابه لما رأيته في المدونة. ولأنني كنت أستخدم MSN Space في ذلك الوقت، فإنه لم يوفر هذه الوظيفة، لذلك كان علي أن أكتب واحدة بنفسي.
لقد استخدمت C# للكتابة في البداية، استخدمت عبارات أساسية مرهقة للغاية مثل for و while وswitch وif وما إلى ذلك للحكم على الكلمات الرئيسية وما إلى ذلك. لا تضحك علي، لقد كنت غبيًا ولم أكن أعرف ما هو كان التعبير العادي في ذلك الوقت، لذا لا يمكنني سوى استخدام هذه الطريقة الخام. بالطبع، لا تزال الطريقة الخام فعالة، فهي مجرد رمز طويل في الوظيفة، وأعتقد أنه سيكون من الصعب جدًا صيانته في المستقبل لا يمكن كتابة البرامج الأخرى بهذه الطريقة، لذلك... بعد البحث على Google لفترة من الوقت، وجدت بعض التعليمات البرمجية والمشاريع مفتوحة المصدر مع تمييز بناء الجملة، وبدأت في إلقاء نظرة. . . . . واو، كل شيء معقد للغاية. لأكون صادقًا، الشيء الذي لا أحب فعله أكثر هو النظر إلى رموز الآخرين، ما لم يكن هناك ذلك وصف مستند مفصل للغاية، وإلا فلن أرغب في إلقاء نظرة عليه للوهلة الأولى، على الأكثر، أنظر فقط إلى كيفية كتابة الأشخاص الآخرين للواجهة، ثم أخمن كيفية تنفيذها داخليًا.
على الرغم من أن البحث لم يكن مفيدًا جدًا، إلا أنه جعلني أعرف عن التعبيرات العادية ونسيت المكان الذي رأيته فيه. في ذلك الوقت، بدأت في دراسة التعبيرات النمطية مع تحسين "أشيائي المكسورة". بعد ذلك بوقت قصير، بدأت التدوين مرة أخرى في Blog Park، وأخيرًا قمت بتمكين وظيفة تسليط الضوء على بناء الجملة في Blog Park، لذلك فقدت دافعًا كبيرًا لكتابة الكود الخاص بي لتسليط الضوء على HTML. ثانيًا، لا يمكن تشغيل وحدة تمييز بناء الجملة المصنوعة في C# إلا من جانب الخادم أو برنامج WinForm، وما أريد الحصول عليه في النهاية هو كود HTML لعرضه على الصفحة، وأعتقد أن البرامج النصية من جانب العميل هي الأكثر ملاءمة لهذه المهمة. من المؤسف أنني لا أعرف الكثير عن JS. . . لاحقًا، بدأت العبث بأشياء أخرى خلال هذه الفترة، ولم أقم بتحسين وحدة تمييز بناء الجملة.
لقد عملت وقتًا إضافيًا الليلة الماضية ورجعت إلى المنزل، وكنت أخطط في الأصل لمواصلة تعلم UML ورؤية الأنماط، ثم تذكرت أن الشركة لديها وحدة تحتاج إلى إزالة جميع علامات HTML في النتائج التي تعرضها قاعدة البيانات، لذلك فتحت النموذج العادي. أداة التعبير RegexBuddy. ونتيجة لذلك، رأيت برنامجًا تعليميًا بسيطًا حول استخدام التعبيرات العادية في JScript في مستند مساعدة RegexBuddy، لذلك نشأ فضولي مرة أخرى، لذلك فتحت UltraEdit-32 وبدأت في كتابة JavaScript بسيط للتجربة.
لن أتناول تفاصيل عملية الاختبار الخاصة بي هنا، لأن العديد من الأماكن تتضمن اختبارات متكررة والعديد من التحويلات هنا سأقدم بشكل مباشر استخدام التعبيرات العادية في JScript التي لخصتها من الاختبار.
كفى هراء، فلنصل إلى صلب الموضوع!
يتحدث رئيس الوزراء عن كائن التعبير العادي لـ JScript RegExp.
اسم الفئة الذي يوفر عمليات التعبير العادي في JScript هو RegExp، ويمكن إنشاء كائنات من نوع RegExp بطريقتين.
الطريقة الأولى، إنشاء مثيل للمنشئ:
var myRegex = new RegExp(" \w +", "igm ");
//w+ هو التعبير العادي الفعلي. لاحظ أن الحرف الأول مخصص للهروب من igm ويعني تجاهل الحالة والبحث الشامل والبحث متعدد الأسطر على التوالي.
الطريقة الثانية، طريقة التعيين المباشر:
var myRegex = /w+/igm;
// التأثير هو نفس العبارة السابقة، باستثناء أنه ليست هناك حاجة لاستخدام أحرف النقل هنا. التعبير العادي الأصلي هو كما يبدو igm له نفس تأثير igm في المثال السابق.
تعتمد الطريقة المحددة المستخدمة على تفضيلات الجميع. شخصيًا، أعتقد أن الطريقة الثانية أسهل في القراءة عند كتابة regex، كما توصي وثيقة المساعدة RegexBuddy بالطريقة الثانية. يتضمن كائن RegExp العمليات التالية:
exec(string str): ينفذ مطابقة التعبير العادي ويعيد نتائج المطابقة وفقًا لمثال تشغيل النتائج المقدم من MSDN، يبدأ كل تنفيذ لـ exec من نهاية آخر تطابق مباشر يبدو أن القيمة التي تم إرجاعها هي كائن RerExp، والتفسير الذي قدمه RegexBuddy هو إرجاع مصفوفة، ولكن لم يتم تقديم مثال مفصل أعتقد أنه أكثر موثوقية بناءً على النتائج التجريبية.
ترجمة (سلسلة regex، علامات السلسلة): ترجمة التعبيرات العادية مسبقًا لجعلها تعمل بشكل أسرع، بعد الاختبار، تم تحسين الكفاءة بشكل ملحوظ بعد التجميع المسبق. تعد معلمة regex تعبيرًا عاديًا، ويمكن أن تكون العلامات عبارة عن مزيج من القيم الثلاث التالية: g - بحث عام، وكانت نتيجة الاختبار الخاصة بي هي أنه بدون إضافة علامة g، يمكن أن تتطابق فقط مع السلسلة المؤهلة الأولى i - متجاهلة الحالة m - يبدو أن البحث متعدد الأسطر هو بحث متعدد الأسطر بشكل افتراضي
(سلسلة str): إذا تطابق str مع التعبير العادي، فإنه يُرجع صحيحًا، وإلا فإنه يُرجع خطأ.
تحتوي طريقة المطابقة هذه المشابهة لكائن RegExp على السمات التالية :
الفهرس: في السلسلة موضع التعبير المطابق الأول، في البداية -1
الإدخال: الهدف المطابق للتعبير العادي، لاحظ أنه للقراءة فقط
lastIndex: موضع التعبير المطابق التالي. الكلمة الأصلية هي (إرجاع موضع الحرف حيث تبدأ المطابقة التالية في سلسلة تم البحث عنها.) لا أعرف ما إذا كان هناك خطأ في الترجمة ولم أستخدم هذه السمة.
lastMatch: السلسلة الأخيرة المطابقة للتعبير
lastParen: آخر سلسلة مطابقة فرعية، على سبيل المثال، إذا كانت هناك عدة مطابقات مجمعة حسب () في تعبير عادي، فإن lastParen يمثل آخر مجموعة من النتائج المطابقة.
leftContext: جميع الأحرف من بداية السلسلة المستهدفة إلى موضع البداية للمطابقة الأخيرة.
rightContext: جميع الأحرف من نهاية المباراة الأخيرة إلى نهاية السلسلة المستهدفة بأكملها.
$1...$9: يشير إلى نتيجة المجموعة n من التطابقات، وهذا مفيد عندما تكون هناك مجموعات متعددة () في التعبير العادي.
بعد ذلك، لنتحدث عن العمليات المتعلقة بكائن السلسلة والتعبيرات العادية في JScript:
match (سلسلة regex): يقبل التعبير العادي ويعيد ما إذا كانت السلسلة تتطابق مع التعبير.
استبدال (srting regex، string str): استبدل السلسلة الفرعية التي تطابق التعبير العادي بـ str. تبدو هذه الوظيفة بسيطة، ولكنها تخفي أيضًا الاستخدام الأكثر تقدمًا.
مثال 1:
var str1 = "A:اسمي بيتر!nB:مرحبًا بيتر!";
str1 = str1.replace(/Peter/g,"Jack");
تنبيه (ستر1)؛
هذا المثال بسيط مثل استبدال سلسلة، وبالطبع لا تقتصر قوة هذا التعبير على هذا، إذا كنت ماهرًا في استخدامه، فيمكنك أيضًا استخدامه لإكمال العديد من المهام التي كانت تتطلب في السابق الكثير من التعليمات البرمجية. على سبيل المثال، أضف علامات HTML المميزة قبل الكلمات الأساسية للتعليمات البرمجية وبعدها. من المثال السابق، يبدو أن الاستبدال يمكنه فقط استبدال النص المطابق بنص جديد. كيف يمكنني استخدامه لإدراج العلامات قبل الكلمات الرئيسية وبعدها؟ بالتفكير مرة أخرى، إذا كان بإمكانك استخدام النتائج المطابقة عند الاستبدال، فستكون الأمور أسهل، فما عليك سوى استبدال الكلمات الرئيسية بـ: رأس العلامة + الكلمة الرئيسية + ذيل العلامة.
ولكن كيف يمكن استخدام نتائج مطابقة التعبير العادي في الاستبدال؟
في هذا الوقت نحتاج إلى استخدام "متغيرات المطابقة". يتم استخدام متغيرات المطابقة لتمثيل نتائج المطابقة العادية. وفيما يلي وصف للمتغيرات المطابقة:
$& -- يمثل النتائج المطابقة لجميع المجموعات المطابقة وأخيرًا، المجموعة المطابقة هي المجموعة () للتعبير العادي.
$$ -- يمثل الحرف $ نظرًا لأن المتغير المطابق يستخدم الحرف $، فإنه يحتاج إلى الهروب.
$n - يشبه $1...$9 السابق، مما يشير إلى المجموعة n من النتائج المطابقة
$nn -- بكل بساطة نتيجة المجموعة التاسعة من التطابقات
$` -- هو السياق الأيسر المذكور سابقًا، على سبيل المثال، إذا كان abcdefg مطابقًا لـ d، فإن abc هو السياق الأيسر.
$' -- إنه قريب جدًا مما ورد أعلاه، فلا تقرأه بشكل خاطئ! ، هذا هو السياق الصحيح. قياسًا على ذلك، efg هو السياق الصحيح للمثال أعلاه، لذا أصبح من السهل جدًا علينا الآن إدراج العلامات قبل الكلمات الأساسية وبعدها:
var str1 = "A:My name is Peter!nB:Hi. بيتر!" ;
str1 = str1.replace(/Peter/g, "<b>$&</b>");
تنبيه (ستر1)؛
إنها بالفعل 0:39. . . دعونا نتوقف هنا.
تنزيل برنامج الأداة العادية (كلمة المرور: regex): regex buddy 2.06.zip
يرجى الاطلاع على المثال الذي كتبته: تسليط الضوء على بناء جملة JScript (تبسيط التعليمات البرمجية)
فيما يلي بعض الأمثلة من MSDN:
function matchDemo()
{
فار.
var re = new RegExp("d(b+)(d)"،"ig");
var str = "cdbBdbsbdbdz";
var arr = re.exec(str);
s = "$1 يحتوي على: " + RegExp.$1 + "n";
s += "$2 يحتوي على: " + RegExp.$2 + "n";
s += "$3 يحتوي على:" + RegExp.$3;
العودة (ق)؛
}
الدالة RegExpTest()
{
var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
إذا (الإصدار >= 5.5){
var src = "تهطل الأمطار في إسبانيا بشكل رئيسي في السهل.";
var re = /w+/g;
فار آر؛
بينما ((arr = re.exec(src)) != null)
print(arr.index + "-" + arr.lastIndex + "t" + arr);
}
آخر{
تنبيه ("أنت بحاجة إلى إصدار أحدث من JScript حتى يعمل هذا")؛
}
}
الدالة matchDemo()
{
var s;
var re = new RegExp("d(b+)(d)"،"ig"); //نمط التعبير العادي.
var str = "cdbBdbsbdbdz"; // السلسلة المراد البحث فيها.
var arr = re.exec(str);
s = "$1 يُرجع: " + RegExp.$1 + "n";
s += "$2 returns: " + RegExp.$2 + "n";
s += "$3 returns: " + RegExp.$3 + "n";
s += "إرجاع الإدخال : " + RegExp.input + "n";
s += "lastMatch returns: " + RegExp.lastMatch + "n";
s += "leftContext returns:" + RegExp.leftContext + "n";
s += "rightContext returns: " + RegExp.rightContext + "n";
s += "lastParen يُرجع: " + RegExp.lastParen + "n";
return(s);//إرجاع النتائج.
}
document.write(matchDemo());
إذا كان لدى أي من الأبطال المارة أي آراء حول هذه المقالة، فلا تتردد في نشرها هنا، فلنتعلم ونحقق التقدم معًا.