طرق إستخدام التعابير النمطية
يمكن إستخدام التعابير النمطية مع معظم لغات البرمجة المختلفة
وبالتأكيد يمكننا إستخدام التعابير النمطية في لغة C# للبحث واستبدال النصوص المختلفة
وفي درسنا هذا سوف نتعلم النقاط التالية
أولا ما هي التعابير النمطية
طريقة التحقق من وجود النصوص باستخدام خاصية IsMatch
طريقة الحصول على أول نتائج البحث باستخدام خاصية Match
وطريقة الحصول على كافة النتائج باستخدام خاصية Matches
وبالإضافة لهذه الأساسيات سوف نتعلم شيء عن
طريقة إستبدال النصوص باستخدام خاصية Replace
ما معنى التعابير النمطية
التعابير النمطية هي عبارة عن رموز وعلامات تستخدمم مع النصوص من أجل البحث واستخراج واستبدال النصوص المختلفةوباستخدام التعابير النمطية نستطيع تحقيق الكثير من الأمور التي لا نستطيع تحقيقها بالطرق العادية
ونماذج على ضلك هي على النحو التالي
مثلا يمكننا البحث عن النصوص يمكننا البحث عن كلمة ما في أوائل أو خواتيم السطور فقط
ثانيا يمكننا وعلى سبيل المثال حذف كافة أو جزء معين من أكواد html وغيرها
ثالثا يمكننا إستخراج البريد الإلكتروني والروابط المختلفة وغيرها
وغير هذا يوجد الكثير من طرق الإستخدام الأخرى والمفيدة للتعامل مع النصوص المختلفة
وأهم العلامات والرموز المستخدمة في التعابير النمطية هي على النحو التالي
. علامة النقطة تستخدم للدلالة على حرف واحد من الكتابة ما عدى علامة سطر جديد
+ علامة الزائد تستخدم للدلالة لأكثر من حرف من حروف الكتابة
* علامة النجمة تستخدم للدلالة على أن الحرف السابق هو آخر حرف أو تم تكرار نفس الحرف لأكثر من مرة
مثال إذا كتبنا محمد* سوف يتم البحث عن كلمات محمد أو أي كلمة تحتوي على حرف الدال لأكثر من مرة
^ علامة ^ وتستخدم للدلالة على أو السطر
فمثلا إذا كتبنا ^[0-9] يتم البحث عن الأرقام من 0 إلى 9 في أول السطر فقط
$ علامة الدولار وتستخدم للدلالة على نهاية السطر
فمثلا إذا كتبنا ^.{10}$ يتم البحث عن السطرو التي تحتوي على رقم عشرة فقط بمعنى أن لا يحتوي السطر على أي محتوى إلى على هذا الرقم
[ ] الأقواس وتستخدم للدلالة على حصر محتوى البحث بالحروف الموجودة داخل هذه الأقواس
فمثلا إذا كتبنا [a-z] سوف يتم البحث فقط عن الحروف الإنجليزية الصغيرة
[^ ] وهذه الصيغة تستخدم للدلالة على تجاوز محتوى القوسين
فمثلا إذا كتبنا [^A-Z] يتم البحث عن كل شيء ما عدا الحروف الإنجليزية الكبيرة
? علامة الإستفهام وتستخدم للدلالة على أن الحرف السابق هو آخر حرف أو مكرر لمرة واحدة
فمثلا إذا كتبنا محمد? سوف يتم البحث عن أي كلمة كل حروف الدال
{ } الأقواس المزخرفة وتستخدم للدلالة على على البحث عن محتوى الأقواس أو تكرارها
فمثلا إذا كتبنا {ت} سوف يتم البحث في الحرف السابق عن حرف ت لمرة واحدة أو مكررا لأكثر من مرة
ومثال آخر إذا كتبنا {,ت} إذا كان الحرف السابق هو ت أو كان ما قبله ت مكررة
أما إذا كتبنا {ت,} إذا كان الحرف السابق هو ت أو الحروف التالية له كانت ت مكررة
| علامة | وتستخدم للدلالة على إمكانية البحث عن النصوص السابقة واللاحقة لها في آن واحد
فمثلا إذا كتبنا محمد|أحمد سوف يتم البحث عن كلمتي محمد وأحمد في نفس الوقت
( ) ويستخدم محتوى هذه الأقواس للحصول على المجموعات ويمكن إستخدام أسماء المجموعات التي نكتبها داخل هذه الأقواس بين علامتي أصغر وأكبر من للحصول على نتائج البحث المختلفة
ملحوظة هامة, إذا أردنا إستخدام أحد هذه الرموز أو العالامات عند البحث مثلا
فيجب علينا كتابة \ علامة القاطعة الخلفية قبل الرمز المعين
فمثلا إذا أردنا البحث عن علامة . النقطة فيجب أن نكتبها على النحو التالي
\.
وبهذه الطريقة يمكننا إستخدام جميع الرموز الخاصة بالتعابير النمطية داخل كلمة البحث
كيفية إستخدام خاصية IsMatch للتحقق من وجود النصوص
وطريقة إستخدام خاصية IsMatch هي على النحو التاليتحتوي خاصية IsMatch على رافدين أو مكونين إثنين هما
الأول هو المحتوى المراد البحث فيه
والثاني هو التعبير النمطي المراد إستخدامه
ومثال علا ذلك هو كما يلي
using System;
using System.Text.RegularExpressions;
namespace Sample
{
class Sample
{
static void Main()
{
string str = "محمد بشير";
bool result = Regex.IsMatch(str, "مح");
Console.WriteLine(result);
Console.ReadKey();
}
}
}
ونتيجة التنفيذ هي
True
وهذه الخاصية تستخدم للتحقق من وجود التعابير النمطية المستخدمة
وفي ما يلي كيفية إستخراج أو الحصول على نتائج البحث
أولا نستخدم خاصية Match للحصول على أول نتائج البحث فقط
وخاصية Match أيضا تحتوي على مكونين أو رافدين هما
الأول هو محتوى النص المراد البحث فيه
والثاني هو التعابير النمطية المراد إستخدامها
ملحوظة إذا كانت نتائج البحث توجد لأكثر من مرة واحدة فلن يتم التعرف إلا على أول نتيجة فقط فيرجى الإنتباه
ومثال على ذلك هو كما يلي
using System;
using System.Text.RegularExpressions;
namespace Sample
{
class Sample
{
static void Main()
{
string str = "محمد, 123, بشير";
Match matche = Regex.Match(str, "[0-9]");
Console.WriteLine(matche.Value);
Console.ReadKey();
}
}
}
ونتيجة التنفيذ تكون هي رقم 1 فقط ولا يتم التعرف على بقية الأرقام الأخرى كما ذكرنا
وكما نلاحد في هذا النموذج إستخدمنا التعبير النمطي الخاص بالأرقام من 0 إلى 9 وهو [0-9]
أما إذا أردنا الحصول على كافة نتائج البحث فنستخدم خاصية Matches
وباستخدام هذه الخاصية وخلافا للخاصية السابقة يمكننا الحصول على جميع نتائج البحث
وخاصية Matches أيضا تحتوي على مكونين هما
الأول وهو المحتوى المراد البحث فيه
والثاني هو التعبير النمطي المراد إستخدامه عند البحث
وذلك كما هو موضح في النموذج التالي
using System;
using System.Text.RegularExpressions;
namespace Sample
{
class Sample
{
static void Main()
{
string str = "محمد, 123, بشير";
MatchCollection matche = Regex.Matches(str, "[0-9]");
foreach (Match m in matche)
{
Console.WriteLine(m.Value);
}
Console.ReadKey();
}
}
}
ونتيجة التنفيذ تكون على النحو التالي
1
2
3
وخلافا للنموذج السابق في هذا المثال يتم الحصول على كل الأرقام بين 0 و9
مثال آخر متقدم نستخدم فيه المجموعات ونحصل فيه على أسماء الروابط ومساراتها
أولا نفترض أن لدينا ملف html باسم reg.html ويكون محتواه على النحو التالي
الرابط الأول
هنا يوجد الرابط الثاني
الرابط الثاني
الرابط الثالث
الرابط الرابع
وبعد حفظ هذا الملف في نفس مجلد ملف التشغيل نقوم باستخدام الأكواد التالية
// كتابة التعبير النمطي الخاص بالتعامل مع الروابط
var reg = @"]*href\s*=\s*[""'](?
using (var reader = new StreamReader(@"reg.html"))
{
var text = reader.ReadToEnd();
var r = new Regex(reg, RegexOptions.IgnoreCase);
var collection = r.Matches(text);
foreach (Match m in collection)
{
//إظهار نتائج البحث , أسماء ومسارات الروابط المختلفة بالترتيب
Console.WriteLine($"{m.Groups["text"].Value.Trim()}:{m.Groups["href"]}");
}
}
وبعد كتابة هذه السطور البرمجية وتنفيذها سوف يتم إظهار جميع أسماء ومسارات الروابط الأربعة المذكورة في الملف السابق
وأخيرا يمكننا إستبدال النصوص باستخدام التعابير النمطية وذلك من خلال خاصية Replace
وخاصية Replace أيضا تحتوي على مكونين هما
الأول هو المحتوى المراد البحث فيه
والثاني هو التعبير النمطي أو كلمة البحث
ولمعرفة كتابتها الرجاء الإطلاع على النموذج التالي
using System;
using System.Text.RegularExpressions;
namespace Sample
{
class Sample
{
static void Main()
{
string str = "محمد بشير";
Regex reg = new Regex("محمد");
string result = reg.Replace(str, "حسن");
Console.WriteLine(result);
Console.ReadKey();
}
}
}
ونتيجة التنفيذ تكون حسن بشير
وفي الختام أسأل الله لي ولكم التوفيق والنجاح