حدد السماح لحرف "|" للاختيار من بين مرشحين أو أكثر. من خلال توسيع نطاق التعبير المنتظم لعنوان الفصل ، يمكن توسيعه إلى تعبير ينطبق أكثر من مجرد عنوان الفصل. ومع ذلك ، هذا ليس مباشرة كما هو متوقع. عند استخدام الاختيار ، سيتم مطابقة التعبير الأكثر ترجيحًا لكل جانب من جوانب "| قد تعتقد أن تعبيرات JScript و VBScript التالية ستتطابق مع "الفصل" أو "القسم" في مواقع البداية والنهاية للصف وتتبعها رقم أو رقمين:
/^Chapter|Section [1-9][0-9]{0,1}$/ ^Chapter|Section [1-9][0-9]{0,1}___FCKpd___0quot;لسوء الحظ ، فإن الحالة الحقيقية هي أن التعبير العادي الموضح أعلاه يطابق كلمة "الفصل" في بداية السطر أو يتطابق مع "القسم" في نهاية الخط متبوعًا بأي رقم. إذا كانت سلسلة الإدخال هي "الفصل 22" ، فإن التعبير أعلاه سوف يتطابق فقط مع كلمة "الفصل". إذا كانت سلسلة الإدخال هي "القسم 22" ، فسيتطابق التعبير إلى "القسم 22". لكن هذه النتيجة ليست هدفنا هنا ، لذلك يجب أن تكون هناك طريقة لجعل التعبيرات العادية أكثر استجابة لما سيفعلونه ، وهناك بالفعل مثل هذه الطريقة.
يمكن استخدام الأقواس للحد من نطاق الخيارات ، أي أنه من الواضح أن الاختيار ينطبق فقط على كلمتين "الفصل" و "القسم". ومع ذلك ، يصعب التعامل مع الأقواس أيضًا لأنها تستخدم أيضًا لإنشاء التعبيرات الفرعية ، وسيتم تقديم بعضها لاحقًا في القسم الخاص بالاعثار الفرعي. من خلال أخذ التعبير العادي الموضح أعلاه وإضافة قوسين في الموقع المناسب ، يمكن إجراء التعبير العادي لمطابقة كل من "الفصل 1" و "القسم 3".
يستخدم التعبير العادي التالي أقواس إلى مجموعة "الفصل" و "القسم" بحيث يعمل التعبير بشكل صحيح. ل jscript:
/^(Chapter|Section) [1-9][0-9]{0,1}$/ل VBScript:
^(Chapter|Section) [1-9][0-9]{0,1}___FCKpd___2quot;تعمل هذه التعبيرات بشكل صحيح وتنتج مجرد منتج ثانوي مثير للاهتمام. إن وضع الأقواس على جانبي "الفصل | القسم" ينشئ مجموعة مناسبة ، ولكنه يتسبب أيضًا في مطابقة إحدى الكلمتين لاستخدامها في المستقبل. نظرًا لوجود مجموعة واحدة فقط من الأقواس في التعبير الموضح أعلاه ، لا يمكن أن يكون هناك سوى اندفاع فرعي واحد تم التقاطه. يمكن الرجوع إلى هذا الدقة الفرعية باستخدام مجموعة subscheds من VBScript أو سمات $ 1- 9 دولارات لكائن regexp في JScript.
في بعض الأحيان يكون التقاط مباراة فرعية أمرًا مرغوبًا فيه ، وأحيانًا غير مرغوب فيه. في المثال الموضح في الوصف ، ما تريد فعله حقًا هو استخدام الأقواس لتجميع الاختيار بين الكلمات "الفصل" أو "القسم". ليس من المرغوب فيه الإشارة إلى المباراة لاحقًا. في الواقع ، يرجى عدم استخدامه إلا إذا كنت بحاجة حقًا إلى التقاط المباراة الفرعية. سيكون هذا التعبير العادي أكثر كفاءة لأنه لا يتطلب الوقت والذاكرة لتخزين تلك الممرات الفرعية.
يمكنك استخدام "؟:" أمام أقواس نمط التعبير العادي لمنع تخزين هذه المباراة للاستخدام في المستقبل. توفر التعديلات التالية للتعبير العادي الموضح أعلاه نفس الوظيفة التي تلغي تخزين الخرق الفرعية. ل jscript:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ل VBScript:
^(?:Chapter|Section) [1-9][0-9]{0,1}___FCKpd___4quot;بالإضافة إلى "؟:" metacharacter ، هناك نوعان من metacharacters غير المشتركة المستخدمة في المباريات التي تسمى عمليات الفحص المسبق . يتم تمثيل التحديد المسبق للأمام؟ = ، حيث يبدأ نمط التعبير العادي بين قوسين في مطابقة سلسلة البحث. يشار إلى فحص مسبق سلبي "؟!
على سبيل المثال ، افترض أن هناك مستندًا يحتوي على إشارات إلى Windows 3.1 و Windows 95 و Windows 98 و Windows NT. على افتراض أنه يجب تحديث المستند من خلال البحث عن جميع الإشارات إلى Windows 95 و Windows 98 و Windows NT وتغيير هذه المراجع إلى Windows 2000. يمكنك استخدام التعبير العادي JScript التالي ، وهو التحقق المسبق للأمام لمطابقة Windows 95 و Windows 98 و Windows NT:
/Windows(?=95 |98 |NT )/ لجعل نفس المباراة في VBScript ، يمكنك استخدام التعبير التالي: Windows(?=95 |98 |NT )
بمجرد العثور على المباراة ، يبدأ البحث في المباراة التالية مباشرة بعد النص المطابق (لا يشمل الأحرف المستخدمة في ما قبل الاستيعاب). على سبيل المثال ، إذا كان التعبير الموضح أعلاه يطابق "Windows 98" ، فسيستمر البحث من "Windows" بدلاً من "98".
واحدة من أهم ميزات التعبيرات العادية هي القدرة على تخزين جزء من النمط الناجح المطابق للاستخدام لاحقًا. أذكر أن إضافة الأقواس إلى جانبي نمط التعبير العادي أو النمط الجزئي سيؤدي إلى تخزين التعبير الجزئي في المخزن المؤقت المؤقت. يمكن استخدام metacharacters غير المحببة ؟: '،'؟ = '، أو'؟!
يتم تخزين كل نخبة فرعية تم التقاطها حيث تم مواجهة المحتوى الذي تمت مواجهته من اليسار إلى اليمين في نمط التعبير العادي. يبدأ رقم المخزن المؤقت الذي يخزن الممرات الفرعية من 1 ويتم ترقيمه على التوالي حتى التعبير الفرعي 99 الحد الأقصى. يمكن الوصول إلى كل المخزن المؤقت باستخدام "/ n " ، حيث يكون N رقمًا عشريًا من رقمين يحدد المخزن المؤقت.
الاقتباس المتخلف أحد التطبيقات الأسهل والأكثر فائدة هو القدرة على تحديد مكان ظهور كلمتين متطابقين في نص متتالي. يرجى الاطلاع على الجملة التالية:
Is is the cost of of gasoline going up up?وفقًا للمحتوى المكتوب ، من الواضح أن الجملة أعلاه لديها مشكلة الكلمات المتكررة بشكل متكرر. سيكون من الرائع أن يكون هناك طريقة لتعديل الجملة دون البحث عن تكرار كل كلمة. يمكن للتعبير العادي JScript التالي تحقيق هذه الوظيفة باستخدام التعبير الفرعي.
//b([az]+) /1/b/giتعبير VBScript المكافئ هو:
/b([az]+) /1/bفي هذا المثال ، يكون التعبير الفرعي هو كل عنصر بين الأقواس. يتضمن التعبير الذي تم التقاطه حرفًا أو أكثر من الأحرف الأبجدية ، أي المحدد بواسطة "[AZ]+". الجزء الثاني من التعبير العادي هو إشارة إلى المباراة الفرعية التي تم التقاطها مسبقًا ، أي الحدوث الثاني للكلمة التي تطابقها التعبير الإضافي. يتم استخدام "/1" لتحديد أول خداع فرعي. تضمن أحرف العناصر الحدودية للكلمة اكتشاف الكلمات الفردية فقط. إذا لم يكن الأمر كذلك ، فسيتم التعرف على عبارات مثل الصادرة أو هذا بشكل غير صحيح من خلال التعبير.
في تعبير JScript ، تعني العلم العالمي ("G" بعد التعبير العادي أن التعبير سيتم استخدامه للعثور على أكبر عدد ممكن من المطابقات في سلسلة الإدخال. يتم تحديد حساسية الحالة بواسطة علامة حساسية الحالة ('i') في نهاية التعبير. تحدد العلامات المتعددة الخطوط المطابقات المحتملة التي قد تظهر في طرفي حرف NewLine. بالنسبة إلى VBScript ، لا يمكن تعيين علامات مختلفة في التعبيرات ، ولكن يجب تعيينها بشكل صريح باستخدام خصائص كائن RegexP .
باستخدام التعبير العادي الموضح أعلاه ، يمكن أن يحل رمز JScript التالي استبدال نفس الكلمة التي تظهر مرتين في سلسلة حرفية مع نفس الكلمة باستخدام معلومات المباراة الفرعية:
. var rv = ss.replace(re,$1); //var ss = Is is the cost of of gasoline going up up?./n; var re = //b([az]+) /1/b/gim; //إعادة ، $ 1.. var rv = ss.replace(re,$1); //
أقرب رمز vbscript هو كما يلي:
Dim ss, re, rv ss = Is is the cost of of gasoline going up up?. & vbNewLine Set re = New RegExp re.Pattern = /b([az]+) /1/b re.Global = True re.IgnoreCase = True re.MultiLine = True rv = re.Replace(ss,$1)لاحظ أنه في رمز VBScript ، يتم تعيين العلامات العالمية ، حساسية الحالة ، والعلامات المتعددة باستخدام الخصائص المناسبة لكائن RegexP .
استخدم $ 1 في طريقة استبدال للرجوع إلى الخداع الفرعي الأول المحفوظ. إذا كان هناك عدة مراحل فرعية ، فيمكنك الاستمرار في الإشارة بمبلغ 2 دولار ، 3 دولارات ، إلخ.
استخدام آخر للمراجع الخلفية هو كسر مؤشر الموارد المشتركة (URI) إلى أجزاء مكون. لنفترض أنك ترغب في تحلل URI التالي إلى بروتوكولات (FTP ، HTTP ، إلخ) ، عنوان اسم المجال ، والصفحة/المسار:
http://msdn.microsoft.com:80/scripting/default.htmيمكن أن توفر التعبيرات العادية التالية هذه الوظيفة. لـ JScript ، على النحو التالي:
/(/w+):////([^/:]+)(:/d*)?([^# ]*)/ل VBScript:
(/w+):////([^/:]+)(:/d*)?([^# ]*)يتم استخدام أول تعبير فرعي إضافي لالتقاط جزء البروتوكول من عنوان الويب. يطابق هذا التعبير الفرعي أي كلمة تقع أمام القولون واثنين من الملاذات الأمامية. يلتقط التعبير الفرعي الإضافي الثاني عنوان اسم المجال لهذا العنوان. يطابق هذا التعبير الفرعي أي تسلسل أحرف لا يتضمن "^" أو "أو" أو ":" الأحرف. يلتقط التعبير الفرعي الإضافي الثالث رقم منفذ الموقع إذا تم تحديد رقم المنفذ. يتطابق هذا التعبير عن الأرقام الصفر أو أكثر تليها القولون. أخيرًا ، يلتقط المسار الفرعي الإضافي الرابع المسار المحدد بواسطة عنوان الويب و/أو معلومات الصفحة. يطابق هذا التعبير الفرعي أحرفًا واحدة ومتعددة باستثناء "#" أو مساحة.
بعد تطبيق هذا التعبير المعتاد على URI الموضح أعلاه ، يحتوي المباراة الفرعية على ما يلي:
regexp. $ 1 يحتوي على http
REGEXP. 2 دولار يحتوي على msdn.microsoft.com
regexp. 3 دولارات تشمل: 80
regexp. 4 $ يحتوي على /scripting/default.htm