مشاركة عبر


مثال: المسح بحثاً عن HREFs

يبحث المثال التالي في سلسلة إدخال ويقوم بطباعة كافة قيم href = "…" و المواقع الخاصة بهم في السلسلة.

الكائن Regex

لأن DumpHRefsيمكن استدعاء الأسلوب عدة مرة/مرات من تعليمات برمجية للمستخدم، فإنه يستخدم static(Sharedفي Visual أساسى) Regex.Match(String, String, RegexOptions)الأسلوب. وهذا يتيح لمشغل التعبيرات العادية ليقوم بالتخزين المؤقت للتعبيرات العادية و تجنب عناء إنشاء مثيل كائن Regex جديد في كل مرة يتم استدعاء الأسلوب. ثم يتم استخدام الكائن Match ليقوم بالتكرار خلال كافة التطابقات في السلسلة.

Private Sub DumpHRefs(inputString As String) 
   Dim m As Match
   Dim HRefPattern As String = "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"

   m = Regex.Match(inputString, HRefPattern, _ 
                   RegexOptions.IgnoreCase Or RegexOptions.Compiled)
   Do While m.Success
      Console.WriteLine("Found href {0} at {1}.", _
                        m.Groups(1), m.Groups(1).Index)
      m = m.NextMatch()
   Loop   
End Sub
private static void DumpHRefs(string inputString) 
{
   Match m;
   string HRefPattern = "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))";

   m = Regex.Match(inputString, HRefPattern, 
                   RegexOptions.IgnoreCase | RegexOptions.Compiled);
   while (m.Success)
   {
      Console.WriteLine("Found href " + m.Groups[1] + " at " 
         + m.Groups[1].Index);
      m = m.NextMatch();
   }   
}

ثم يوضح المثال التالي استدعاء الأسلوب DumpHRefs.

Public Sub Main()
   Dim inputString As String = "My favorite web sites include:</P>" & _
                               "<A HREF=""https://msdn2.microsoft.com"">" & _
                               "MSDN Home Page</A></P>" & _
                               "<A HREF=""https://www.microsoft.com"">" & _
                               "Microsoft Corporation Home Page</A></P>" & _
                               "<A HREF=""https://blogs.msdn.com/bclteam"">" & _
                               ".NET Base Class Library blog</A></P>"
   DumpHRefs(inputString)                     
End Sub
' The example displays the following output:
'       Found href https://msdn2.microsoft.com at 43
'       Found href https://www.microsoft.com at 102
'       Found href https://blogs.msdn.com/bclteam/) at 176
public static void Main()
{
   string inputString = "My favorite web sites include:</P>" +
                        "<A HREF=\"https://msdn2.microsoft.com\">" +
                        "MSDN Home Page</A></P>" +
                        "<A HREF=\"https://www.microsoft.com\">" +
                        "Microsoft Corporation Home Page</A></P>" +
                        "<A HREF=\"https://blogs.msdn.com/bclteam\">" +
                        ".NET Base Class Library blog</A></P>";
   DumpHRefs(inputString);                     

}
// The example displays the following output:
//       Found href https://msdn2.microsoft.com at 43
//       Found href https://www.microsoft.com at 102
//       Found href https://blogs.msdn.com/bclteam at 176

يتم تفسير نموذج التعبير العادي href\s*=\s*(?:"(?<1>[^""]*)"|(?<1>\S+)) كما هو موضح في الجدول التالي.

النمط

الوصف

href

مطابقة سلسلة قيمة حرفية“ href ”. مطابقة هو عدم تحسس حالة الأحرف.

\s*

يطابق صفر أو أكثر من أحرف مسافة بيضاء.

=

تطابق علامة يساوي.

\s*

يطابق صفر أو أكثر من أحرف مسافة بيضاء.

(?:"(?<1>[^""]*)"|(?<1>\S+))

مطابقة واحد التالية دون تعيين النتيجة إلى مجموعة الذي تم التقاطه:

  • على علامة اقتباس، متبوعة بتواجد صفر أو أكثر لأي حرف غير ذلك من على علامة اقتباس، متبوعة بعلامة اقتباس. مجموعة باسم 1في هذا النمط.

  • حرف non-أبيض-space واحد أو أكثر. مجموعة باسم 1في هذا النمط.

(?<1>[^"]*)

تعيين تكرار صفر أو أكثر من أي حرف آخر غير علامة اقتباس إلى مجموعة الالتقاط باسم 1.

"(?<1>\S+)

قم بتعيين واحد أو أكثر غير--أحرف المسافة البيضاء إلى مجموعة الالتقاط باسم 1.

فئة نتيجة المطابقة

يتم تخزين نتائج البحث في الفئة Match ، التي توفر الوصول إلى كافة السلاسل الفرعية المُستخرجة بواسطة البحث. أنه أيضا يتذكر سلسلة مبحوث والتعبير العادي قيد الاستخدام، لذا فإنه يمكن استدعاء Match.NextMatchأسلوب إلى القيام بالموقع انتهت آخر ملف "بدء بحث آخر.

اللقطات المسماه بشكل صريح

في التعبيرات العادية التقليدية، يتم إعطاء أقواس الالتقاط تلقائياً أرقام بشكل متتابع. و هذا يوجهنا إلي مشكلتين. الأولى هي أنه إذا تم تعديل تعبير عادي عن طريق إدراج أو إزالة مجموعة الأقواس، فكافة التعليمات البرمجية التي تشير اللقطات المُرقمة يجب أن يتم إعادة كتابتها لتعكس الترقيم الجديد. الثانية، بسبب استخدام مجموعات مختلفة من الأقواس لتوفير تعبيرين بديلين لتطابق مقبول، فقد يكون من الصعوبة تحديد أي من التعبيرات هي التي قامت بإرجاع النتيجة بالفعل.

لمعالجة هذه المشكلات، تدعم الفئة Regex بناء الجملة (?<name>…) لالتقاط المطابقة في فتحة محدد (يمكن تسمة الفتحة باستخدام سلسلة أو عدد صحيح; يمكن أن يتم استرجاع الأعداد صحيحة مرة أخرى بسرعة أكبر). وبالتالي، فالتطابق البديل لنفس السلسلة يمكن توجيهه كافة إلي نفس المكان. في حالة حدوث أي تعارض، فسيتم إسقاط التطابق الأخير ضمن فتحة التطابق الناجح. (على الرغم من ذلك، من المتاح عمل قائمة كاملة من المطابقات المتعددة لفتحة فردية. راجع المجموعة Group.Captures للحصول على التفاصيل.)

راجع أيضًا:

موارد أخرى

التعبيرات العادية في .NET Framework