نقلا عن الأخ الغملاسي : الموضوع
=================================================
السلام عليكم
الدرس السادس : Position Matching تحديد مكان المطابقة
مدة الدرس 6 دقائق
لا جديد عليك معظم الأدوات التي سنتطرق إليها قد مرت عليك سواءً بشكل مباشر أو غير مباشر
بإستثناء الـ Multi Line Mode .
أولاً إستخدام الحدود Using Boundaries
يتفرع منها حدود الكلمة Word Boundaries و حدود النص String Boundaries
حدود الكلمة Word Boundaries و هي تحديد مكان الكلمة بإستخدام الأداة
\b
تم التطرق إليها في الدرس الرابع , ما يهمنا الآن هو نقيض هذه الأداة وهي
\B
وتعني عدم مطابقة حدود الكلمة مثال ذلك
string str1 = "\B-\B"
عند الفحص الكلمة Yes – Yes مطابقة كوننا نبحث عن العلامة - dash لا تحدها كلمة و بالطبع هنا لا تحدها كلمة
سواءً من البداية أو من النهاية كون كِلتا المسافتين في أول و أخر الـ - خولت المطابقة لان المسافة ليست بحد من حدود الكلمة وليست حرف
ينتمى إلى الكلام .
معلومة الأداة
\<
تستخدم لمطابقة بداية الكلمة , لكنها محصورة على برامج دون أخرى وكذلك قليلة الإستخدام
كذلك الأداة
\>
تستخدم لمطابقة نهاية الكلمة , لكن ينطبق عليها ما ينطبق على الأداة \<
حدود النص String Boundaries و تستخدم الأداة ^ لبداية حدود النص أو السطر والأداة $ لنهاية حدود النص أو السطر
وهذا تطرقنا له في الدرس الرابع والمهم الآن هو إستخدامهما في الـ Multi Line Mode
ما هو الـ Multi Line Mode هي الأداة
(?m)
أولاً تستخدم الأداة (?m) مع كل من ^ و $
تعريفها : تقوم الأداة (?m) على إجبار الـ Regex بالتعامل مع الفراغ أو المسافة في النص على أساس أنه نص مستقل بذاته
أو ما يعرف بـ String Separator وبالتحديد حينما يرد داخل النص الـ vbCrLf أي بداية سطر جديد داخل الفقرة
وهذا يعني ببساطة تجزئة النص إلى نصوص مثل Hello There فـ Hell نص و There نص
أخر و هلم جرى . وعلى هذا المنوال اي منوال Multi Line Mode سيكون التطابق في أول النص أو بداية كل مقطع في النص .
و بشكل مفصل : تقوم (?m) على جعل الأداة ^ تأخذ معنىً أخر بحيث تصبح تطابق كل بداية نص أو مقطع في داخل النص
اي تعتبر كل مقطع في النص على اساس أنه نص مستقل بذاته بشرط أن يكون في سطر جديد .
يعني بإختصار شديد البحث عن قيمة معينه بشكل متكرر في كل بداية الفقرة أو النص .
نقيض هذه الأداة هي (?s) وتعني Single Line Mode .
وللعلم الـ Enumerations الموجودة في الـ VB.NET مقدمة على التركيبة النصية في الـ Pattern
مثلاً لو كتبنا صيغة بهذا الشكل
"(?m)^'.+$"
ثم إستخدامنا الـ Enumeration التالي RegexOptions.Singleline فإن خاصية SingleLine تطغى على الصغية
فيعتبر معنى الـ ^ على أساس أنه يبحث فقط عن بداية السطر Line وليس للمعنى الذي سبق ذِكره , وهو تكرار البحث في داخل النص .
يتم إستخدام الـ Multi Line Mode في VB.NET بإحدى الـ Enumerations
الخاصة بـ RegexOptions شاهد المثال التالي
Regex rx = new Regex(str3, RegexOptions.Multiline);
كذلك الأداة A\ تنوب عن ^ و الأداة Z\ تنوب عن $
ولكن لإستخدام الـ Multi Line Mode لا تستخدم الأدوات
\A or \Z
و إستخدم كل من
^ and $
سؤال اهذا الدرس كالتالي
ما هي الأخطاء المرتكبة في هذه التركيبة النصية
const string str3 = "\\A'.+\\Z";
private void Button3_Click(object sender, System.EventArgs e)
{
Match m;
Regex rx = new Regex(str3, RegexOptions.Singleline);
int Counter;
m = rx.Match(txt2.Text);
while (m.Success) {
Counter += 1;
m = m.NextMatch;
}
MessageBox.Show(" There are " + Counter + " Comments in this String ");
}هذا والله أعلم