أساسيات التعبير العادي في C ++

Regular Expression Basics C



ضع في اعتبارك الجملة التالية بين علامات الاقتباس:

'هنا رجلي.'

قد تكون هذه السلسلة داخل الكمبيوتر ، وقد يرغب المستخدم في معرفة ما إذا كانت تحتوي على كلمة man. إذا كانت تحتوي على كلمة رجل ، فقد يرغب بعد ذلك في تغيير كلمة رجل إلى امرأة ؛ بحيث يصبح نص السلسلة كما يلي:







'ها هي سيدتي'.

هناك العديد من الرغبات الأخرى مثل هذه من مستخدم الكمبيوتر. بعضها معقد. التعبير العادي ، المختصر ، regex ، هو موضوع معالجة هذه المشكلات بواسطة الكمبيوتر. يأتي C ++ مع مكتبة تسمى regex. لذلك ، يجب أن يبدأ برنامج C ++ للتعامل مع regex بـ:



#يشمل

#يشمل

استخدام اسم للمحطة؛

تشرح هذه المقالة أساسيات التعبير العادي في C ++.



محتوى المادة

أساسيات التعبير العادي

Regex

سلسلة مثل هنا يا رجلي. أعلاه هو التسلسل الهدف أو السلسلة المستهدفة أو ببساطة الهدف. الرجل ، الذي تم البحث عنه ، هو التعبير العادي ، أو ببساطة ، regex.





مطابقة

يقال إن المطابقة تحدث عند تحديد الكلمة أو العبارة التي يتم البحث عنها. بعد المطابقة ، يمكن أن يتم الاستبدال. على سبيل المثال ، بعد وضع الرجل أعلاه ، يمكن استبداله بالمرأة.

مطابقة بسيطة

يوضح البرنامج التالي كيفية مطابقة كلمة رجل.



#يشمل

#يشمل

استخدام اسم للمحطة؛

intالأساسية()
{

regex reg('رجل')؛
لو (regex_search('هنا رجلي.'وريج))
كلفة<< 'متطابقة' <<endl؛
آخر
كلفة<< 'غير متطابق' <<endl؛

إرجاع 0؛
}

تقوم الدالة regex_search () بإرجاع صواب إذا كان هناك تطابق وإرجاع خطأ إذا لم يحدث تطابق. هنا ، تأخذ الدالة وسيطين: الأولى هي السلسلة الهدف ، والثانية هي كائن regex. التعبير العادي نفسه هو 'رجل' في علامتي اقتباس مزدوجتين. تشكل العبارة الأولى في دالة main () كائن regex. Regex هو نوع ، و reg هو كائن regex. إخراج البرنامج أعلاه 'متطابق' ، حيث يظهر 'man' في السلسلة الهدف. إذا لم يتم رؤية 'man' في الهدف ، فإن regex_search () كان سيعيد القيمة false ، ولن يكون الناتج 'غير مطابق'.

إخراج الكود التالي غير مطابق:

regex reg('رجل')؛
لو (regex_search('هذا هو صنع بلدي.'وريج))
كلفة<< 'متطابقة' <<endl؛
آخر
كلفة<< 'غير متطابق' <<endl؛

غير متطابق لأن التعبير العادي 'man' لا يمكن العثور عليه في السلسلة المستهدفة بأكملها ، 'ها هو صنعي'.

نمط

التعبير النمطي ، الرجل أعلاه ، بسيط للغاية. عادة ما تكون Regexes ليست بهذه البساطة. التعبيرات النمطية لها أحرف أولية. الحروف الأولية هي أحرف لها معاني خاصة. الحرف الأولي هو حرف يتعلق بالأحرف. الحروف الأولية لـ C ++ regex هي:

^$ .* + ؟ ( ) [ ] { } |

التعبير العادي ، مع أو بدون أحرف أولية ، هو نمط.

فئات الأحرف

أقواس مربعة

يمكن أن يحتوي النمط على أحرف داخل أقواس مربعة. بهذا ، سيتطابق موضع معين في السلسلة المستهدفة مع أي من أحرف الأقواس المربعة. ضع في اعتبارك الأهداف التالية:

'القطة في الغرفة.'

'الخفاش في الغرفة.'

'الجرذ في الغرفة.'

يتطابق التعبير العادي ، [cbr] في مع cat في الهدف الأول. سوف يتطابق مع الخفافيش في الهدف الثاني. سيتطابق مع الجرذ في الهدف الثالث. هذا لأن القطة أو الخفافيش أو الجرذ تبدأ بحرف 'ج' أو 'ب' أو 'ص'. يوضح مقطع الكود التالي هذا:

regex reg('[cbr] في')؛
لو (regex_search('القطة في الغرفة.'وريج))
كلفة<< 'متطابقة' <<endl؛
لو (regex_search('الخفاش في الغرفة.'وريج))
كلفة<< 'متطابقة' <<endl؛
لو (regex_search('الجرذ في الغرفة.'وريج))
كلفة<< 'متطابقة' <<endl؛

الخرج هو:

متطابقة

متطابقة

متطابقة

مجموعة من الشخصيات

تتطابق الفئة [cbr] في النمط [cbr] مع عدة أحرف محتملة في الهدف. سيتطابق مع 'ج' أو 'ب' أو 'ص' في الهدف. إذا كان الهدف لا يحتوي على أي من 'c' أو 'b' أو 'r' ، متبوعًا بـ at ، فلن يكون هناك تطابق.

توجد بعض الاحتمالات مثل 'ج' أو 'ب' أو 'ص' في نطاق. نطاق الأرقام ، من 0 إلى 9 به 10 احتمالات ، والنمط الخاص بذلك هو [0-9]. نطاق الحروف الأبجدية الصغيرة ، من الألف إلى الياء ، به 26 احتمالًا ، والنمط الخاص بذلك هو [a-z]. نطاق الحروف الهجائية الكبيرة ، من الألف إلى الياء ، له 26 احتمالًا ، والنمط الخاص بذلك هو [A-Z]. - ليس حرفًا أوليًا رسميًا ، ولكنه يشير إلى نطاق داخل الأقواس المربعة. لذلك ، ينتج عن ما يلي تطابق:

لو (regex_search('ID6id'وregex('[0-9]')))

كلفة<< 'متطابقة' <<endl؛

لاحظ كيف تم إنشاء regex كوسيطة ثانية. تحدث المطابقة بين الرقم ، 6 في النطاق ، من 0 إلى 9 ، والرقم 6 في الهدف ، ID6id. الكود أعلاه يعادل:

لو (regex_search('ID6id'وregex('[0123456789]')))

كلفة<< 'متطابقة' <<endl؛

ينتج عن الكود التالي تطابق:

شارص[] = 'ID6iE'؛

لو (regex_search(صوregex('[a-z]')))

كلفة<< 'متطابقة' <<endl؛

لاحظ أن الوسيطة الأولى هنا هي متغير سلسلة وليس سلسلة حرفية. المطابقة بين 'i' في [a-z] و 'i' في ID6iE.

لا تنس أن النطاق هو فئة. يمكن أن يكون هناك نص على يمين النطاق أو على يسار النطاق في النمط. ينتج عن الكود التالي تطابق:

لو (regex_search(ID2id هو معرف 'وregex('المعرّف [0-9] المعرّف')))

كلفة<< 'متطابقة' <<endl؛

المطابقة بين معرف [0-9] معرف و ID2id. بقية السلسلة الهدف ، هي معرّف ، غير متطابقة في هذه الحالة.

كما هو مستخدم في موضوع التعبير العادي (regexes) ، فإن كلمة class تعني في الواقع مجموعة. وهذا يعني أن أحد الأحرف في المجموعة هو المطابقة.

ملاحظة: الواصلة - هي حرف أولي فقط داخل أقواس مربعة ، مما يشير إلى النطاق. إنه ليس حرفًا أوليًا في التعبير العادي ، خارج الأقواس المربعة.

النفي

يمكن إبطال فئة تتضمن نطاقًا. أي أنه يجب عدم تطابق الأحرف في المجموعة (الفئة). يشار إلى ذلك بالحرف الأولي ^ في بداية نمط الفصل ، بعد قوس الفتح المربع مباشرة. لذا ، [^ 0-9] تعني مطابقة الحرف في الموضع المناسب في الهدف ، وهو ليس أي حرف في النطاق ، من 0 إلى 9 ضمناً. لذلك لن ينتج عن الكود التالي تطابق:

لو (regex_search('0123456789101112'وregex('[^ 0-9]')))

كلفة<< 'متطابقة' <<endl؛

آخر

كلفة<< 'غير متطابق' <<endl؛

يمكن العثور على رقم ضمن النطاق من 0 إلى 9 في أي من مواضع السلسلة المستهدفة ، 0123456789101112 ؛ لذلك لا يوجد تطابق - نفي.

ينتج عن الكود التالي تطابق:

لو (regex_search('ABCDEFGHIJ'وregex('[^ 0-9]')))

كلفة<< 'متطابقة' <<endl؛

تعذر العثور على أي رقم في الهدف ، ABCDEFGHIJ ، ؛ لذلك هناك تطابق.

[a-z] نطاق خارج [^ a-z]. وهكذا فإن [^ a-z] هو نفي [a-z].

[A-Z] نطاق خارج [^ A-Z]. وهكذا فإن [^ A-Z] هو نفي [A-Z].

توجد نفيات أخرى.

مطابقة المسافات

'' أو t أو r أو n أو f هو حرف مسافة بيضاء. في التعليمات البرمجية التالية ، يتطابق التعبير العادي n مع ' n' في الهدف:

لو (regex_search('من السطر الأول. rنالسطر الثاني.وregex('ن')))

كلفة<< 'متطابقة' <<endl؛

مطابقة أي حرف مسافة بيضاء

النمط أو الفئة التي تتطابق مع أي حرف مسافة بيضاء هي ، [ t r n f]. في الكود التالي ، تمت مطابقة '':

لو (regex_search('واحد اثنان'وregex('[ t rنF] ')))

كلفة<< 'متطابقة' <<endl؛

مطابقة أي حرف غير مسافة بيضاء

النمط أو الفئة التي تتطابق مع أي حرف مسافة غير بيضاء هي ، [^ t r n f]. ينتج عن الكود التالي تطابق لأنه لا توجد مسافة بيضاء في الهدف:

لو (regex_search('1234abcd'وregex('[^ t rنF] ')))

كلفة<< 'متطابقة' <<endl؛

النقطة (.) في النموذج

النقطة (.) في النمط تطابق أي حرف بما في ذلك نفسه ، باستثناء n ، في الهدف. يتم إنتاج تطابق في الكود التالي:

لو (regex_search('1234abcd'وregex('.')))

كلفة<< 'متطابقة' <<endl؛

لا توجد نتائج مطابقة في التعليمات البرمجية التالية لأن الهدف هو n.

لو (regex_search('ن'وregex('.')))

كلفة<< 'متطابقة' <<endl؛

آخر

كلفة<< 'غير متطابق' <<endl؛

ملاحظة: داخل فئة الأحرف ذات الأقواس المربعة ، ليس للنقطة معنى خاص.

مطابقة التكرار

يمكن أن يظهر حرف أو مجموعة أحرف أكثر من مرة داخل السلسلة الهدف. يمكن أن يتطابق النمط مع هذا التكرار. تُستخدم الأحرف الأولية ،؟ ، * ، + ، و {} لمطابقة التكرار في الهدف. إذا كانت x هي إحدى السمات المهمة في السلسلة الهدف ، فإن الأحرف الأولية يكون لها المعاني التالية:

x*:يعني تطابق'x' 0أو مرات أكثروأنا.و.وأي عدد من المرات

x+:يعني تطابق'x' 1أو مرات أكثروأنا.و.ومرة على الاقل

x؟ :يعني تطابق'x' 0أو1 زمن

x{نو}:يعني تطابق'x'على الأقل ن أو أكثر من المرات.ملحوظةالفاصلة.

x{ن} :تطابق'x'بالضبط n مرات

x{نوم}:تطابق'x'على الأقل ن مراتوولكن ليس أكثر من م مرة.

تسمى هذه الأحرف الأولية محددو الكمية.

الرسوم التوضيحية

*

* يطابق الحرف السابق أو المجموعة السابقة ، صفر أو أكثر من المرات. o * تطابق 'o' في كلب السلسلة المستهدفة. كما أنها تطابق oo في الكتاب والبحث. يتطابق التعبير المعتاد ، o * مع boooo في The animal booooed .. ملاحظة: o * تطابق dig ، حيث يظهر 'o' صفرًا (أو أكثر) من الوقت.

+

يتطابق + مع الحرف السابق أو المجموعة السابقة ، مرة واحدة أو أكثر. قارنها بصفر أو مرات أكثر لـ *. لذا فإن التعبير المعتاد ، e + يتطابق مع 'e' في 'أكل' ، حيث يظهر الحرف 'e' مرة واحدة. تتطابق e + أيضًا مع ee في الأغنام ، حيث يظهر الحرف 'e' أكثر من مرة. ملاحظة: e + لن يتطابق مع حفر لأنه في الحفر ، لا يحدث 'e' مرة واحدة على الأقل.

؟

ال ؟ يتطابق مع الحرف السابق أو المجموعة السابقة ، 0 أو مرة واحدة (وليس أكثر). لذا ، البريد؟ يطابق حفر لأن 'e' يحدث في حفر ، صفر مرة. ه؟ يتم تعيين المطابقات لأن 'e' يحدث في مجموعة ، مرة واحدة. ملاحظة: البريد؟ لا يزال يطابق الأغنام. على الرغم من وجود اثنين في الأغنام. هناك فارق بسيط هنا - انظر لاحقًا.

{ن،}

يتطابق هذا مع عدد n من التكرارات المتتالية على الأقل للحرف السابق أو المجموعة السابقة. لذا فإن التعبير العادي ، e {2 ،} يطابق الحرفين 'e' في الهدف ، الأغنام ، و 'e's الثلاثة' في الجزء المستهدف. لا يتطابق e {2،} مع المجموعة ، لأن المجموعة تحتوي على 'e' واحد فقط.

{ن}

يتطابق هذا تمامًا مع تكرار n متتالي للحرف السابق أو المجموعة السابقة. لذا فإن التعبير المعتاد ، e {2} يطابق الحرفين 'e' في الهدف ، خروف. لا يتطابق e {2} مع المجموعة نظرًا لأن المجموعة تحتوي على 'e' واحد فقط. حسنًا ، e {2} يطابق حرفين إلكترونيين في الهدف ، شييب. هناك فارق بسيط هنا - انظر لاحقًا.

{ن ، م}

يتطابق هذا مع عدة عمليات تكرار متتالية للحرف السابق أو المجموعة السابقة ، في أي مكان من n إلى m ، ضمناً. لذا ، فإن e {1،3} يطابق أي شيء في dig ، والذي لا يحتوي على 'e'. إنها تتطابق مع حرف 'e' في المجموعة ، و 'e' في الأغنام ، و 'e' الثلاثة في Sheeep ، و 'e' الثلاثة في Sheeeep. هناك فارق بسيط في المباراة الأخيرة - انظر لاحقًا.

تناوب المطابقة

ضع في اعتبارك السلسلة الهدف التالية في الكمبيوتر.

المزرعة بها خنازير مختلفة الأحجام.

قد يرغب المبرمج في معرفة ما إذا كان هذا الهدف يحتوي على ماعز أو أرنب أو خنزير. سيكون الرمز كما يلي:

شارص[] = 'المزرعة بها خنازير بأحجام مختلفة.'؛

لو (regex_search(صوregex('ماعز | أرنب | خنزير')))

كلفة<< 'متطابقة' <<endl؛

آخر

كلفة<< 'غير متطابق' <<endl؛

ينتج الرمز تطابق. لاحظ استخدام حرف التبديل ، |. يمكن أن يكون هناك خياران وثلاثة وأربعة والمزيد من الخيارات. سيحاول C ++ أولاً مطابقة البديل الأول ، الماعز ، في كل موضع حرف في السلسلة المستهدفة. إذا لم تنجح مع الماعز ، فإنها تحاول البديل التالي ، الأرنب. إذا لم ينجح الأمر مع الأرنب ، فإنه يجرب البديل التالي ، أي الخنزير. إذا فشل الخنزير ، ينتقل C ++ إلى الموضع التالي في الهدف ويبدأ بالبديل الأول مرة أخرى.

في الكود أعلاه ، تمت مطابقة الخنزير.

بداية المطابقة أو النهاية

بداية


إذا كان ^ في بداية regex ، فيمكن عندئذٍ مطابقة النص الأول للسلسلة الهدف بواسطة regex. في الكود التالي ، بداية الهدف هي abc ، والتي تتم مطابقتها:

لو (regex_search('abc and def'وregex('^ abc')))

كلفة<< 'متطابقة' <<endl؛

لا تحدث أي مطابقة في الكود التالي:

لو (regex_search('نعم ، abc و def'وregex('^ abc')))

كلفة<< 'متطابقة' <<endl؛

آخر

كلفة<< 'غير متطابق' <<endl؛

هنا ، abc ليس في بداية الهدف.

ملاحظة: الحرف المحيط ، '^' ، هو حرف أولي في بداية التعبير العادي ، يطابق بداية السلسلة المستهدفة. لا يزال الحرف الأولي في بداية فئة الحرف ، حيث ينفي الفئة.

نهاية

إذا كان $ في نهاية regex ، فيمكن مطابقة نص نهاية السلسلة المستهدفة بواسطة regex. في الكود التالي ، نهاية الهدف هي xyz ، وهي مطابقة:

لو (regex_search('uvw و xyz'وregex('xyz $')))

كلفة<< 'متطابقة' <<endl؛

لا تحدث أي مطابقة في الكود التالي:

لو (regex_search('نهائي uvw و xyz'وregex('xyz $')))

كلفة<< 'متطابقة' <<endl؛

آخر

كلفة<< 'غير متطابق' <<endl؛

هنا ، xyz ليس في نهاية الهدف.

التجمع

يمكن استخدام الأقواس لتجميع الأحرف في نمط ما. ضع في اعتبارك التعبير المعتاد التالي:

'حفلة موسيقية (عازف البيانو)'

المجموعة هنا هي عازف البيانو محاطة بالحرفين الأوليين (و). إنها في الواقع مجموعة فرعية ، بينما الحفلة الموسيقية (عازف البيانو) هي المجموعة بأكملها. ضع في اعتبارك ما يلي:

'(عازف البيانو جيد)'

هنا ، المجموعة الفرعية أو السلسلة الفرعية ، عازف البيانو جيد.

سلاسل فرعية مع أجزاء مشتركة

المحاسب هو الشخص الذي يعتني بالكتب. تخيل مكتبة بها محاسب ورف كتب. افترض أن إحدى السلاسل المستهدفة التالية موجودة في الكمبيوتر:

'المكتبة بها رف كتب يحظى بإعجاب' ؛

'هنا هو كاتب الحسابات.'؛

'كاتب الحسابات يعمل مع رف الكتب.'؛

افترض أن اهتمام المبرمج هو عدم معرفة أي من هذه الجمل موجود في الكمبيوتر. ومع ذلك ، فإن اهتمامه هو معرفة ما إذا كان رف الكتب أو كاتب الحسابات موجودًا في أي سلسلة مستهدفة في الكمبيوتر. في هذه الحالة ، يمكن أن يكون تعبيره العادي:

'رف الكتب | محاسب.'

باستخدام التناوب.

لاحظ أن الكتاب ، المشترك بين كلتا الكلمتين ، تمت كتابته مرتين ، بالكلمتين في النمط. لتجنب كتابة الكتاب مرتين ، من الأفضل كتابة regex على النحو التالي:

'كتاب (رف | حارس)'

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

شارص[] = 'المكتبة بها رف كتب يحظى بإعجاب'.؛

لو (regex_search(صوregex('كتاب (رف | حارس)')))

كلفة<< 'متطابقة' <<endl؛

رف الكتب وليس كاتب الحسابات.

icase ومتعدد الأسطر regex_constants

الحالة أنا

المطابقة حساسة لحالة الأحرف بشكل افتراضي. ومع ذلك ، يمكن جعلها غير حساسة لحالة الأحرف. لتحقيق ذلك ، استخدم ثابت regex :: icase ، كما في الكود التالي:

لو (regex_search('استجابة'وregex('تغذية'وregex::الحالة أنا)))

كلفة<< 'متطابقة' <<endl؛

الإخراج مطابق. لذلك تمت مطابقة التعليقات ذات الأحرف الكبيرة 'F' بخلاصة بحرف صغير 'f'. تم جعل regex :: icase الوسيطة الثانية لمنشئ regex (). بدون ذلك ، لن ينتج البيان تطابق.

متعدد الأسطر

ضع في اعتبارك الكود التالي:

شارص[] = 'خط 1نخط 2نالسطر 3 '؛

لو (regex_search(صوregex('^. * $')))

كلفة<< 'متطابقة' <<endl؛

آخر

كلفة<< 'غير متطابق' <<endl؛

الإخراج غير مطابق. يتطابق التعبير العادي ^. * $ مع السلسلة الهدف من بدايتها إلى نهايتها. . * تعني أي حرف باستثناء n ، صفر أو أكثر من المرات. لذلك ، بسبب أحرف السطر الجديد ( n) في الهدف ، لم يكن هناك تطابق.

الهدف عبارة عن سلسلة متعددة الأسطر. لكي يتطابق '.' مع حرف السطر الجديد ، يجب عمل regex :: multiline الثابت ، الوسيطة الثانية لبناء regex (). يوضح الكود التالي هذا:

شارص[] = 'خط 1نخط 2نالسطر 3 '؛

لو (regex_search(صوregex('^. * $'وregex::متعدد الأسطر)))

كلفة<< 'متطابقة' <<endl؛

آخر

كلفة<< 'غير متطابق' <<endl؛

مطابقة سلسلة الهدف بالكامل

لمطابقة السلسلة الهدف بالكامل ، والتي لا تحتوي على حرف السطر الجديد ( n) ، يمكن استخدام وظيفة regex_match (). تختلف هذه الوظيفة عن regex_search (). يوضح الكود التالي هذا:

شارص[] = 'اول ثان ثالث'؛

لو (regex_match(صوregex('.*ثانيا.*')))

كلفة<< 'متطابقة' <<endl؛

هناك تطابق هنا. ومع ذلك ، لاحظ أن التعبير العادي يطابق السلسلة المستهدفة بأكملها ، وأن السلسلة الهدف لا تحتوي على أي ' n'.

كائن match_results

يمكن أن تأخذ الدالة regex_search () وسيطة بين الهدف وكائن regex. هذه الوسيطة هي كائن match_results. يمكن معرفة السلسلة (الجزئية) المطابقة بالكامل والسلاسل الفرعية المتطابقة معها. هذا الكائن هو مصفوفة خاصة مع الطرق. نوع الكائن match_results هو cmatch (للسلسلة الحرفية).

الحصول على المباريات

ضع في اعتبارك الكود التالي:

شارص[] = 'المرأة التي كنت تبحث عنها!'؛

سماتش م؛

لو (regex_search(صوموregex('w.m.n')))

كلفة<<م[0] <<endl؛

السلسلة المستهدفة لها كلمة woman. الناتج هو woman ، والذي يتوافق مع regex ، w.m.n. عند الفهرس صفر ، تحمل المصفوفة الخاصة المطابقة الوحيدة ، وهي المرأة.

باستخدام خيارات الصنف ، يتم إرسال أول سلسلة فرعية موجودة في الهدف فقط إلى المصفوفة الخاصة. يوضح الكود التالي هذا:

سماتش م؛

لو (regex_search('الجرذ ، القط ، الخفاش!'وموregex('[bcr] في')))

كلفة<<م[0] <<endl؛

كلفة<<م[1] <<endl؛

كلفة<<م[2] <<endl؛

الناتج هو الجرذ من مؤشر الصفر. م [1] وم [2] فارغة.

مع البدائل ، يتم إرسال السلسلة الفرعية الأولى فقط الموجودة في الهدف إلى المصفوفة الخاصة. يوضح الكود التالي هذا:

لو (regex_search('الأرنب ، الماعز ، الخنزير!'وموregex('ماعز | أرنب | خنزير')))

كلفة<<م[0] <<endl؛

كلفة<<م[1] <<endl؛

كلفة<<م[2] <<endl؛

الناتج هو أرنب من الرقم القياسي صفر. م [1] وم [2] فارغة.

التجمعات

عند مشاركة المجموعات ، ينتقل النمط الكامل المطابق إلى الخلية صفر في المصفوفة الخاصة. يتم العثور على السلسلة الفرعية التالية في الخلية 1 ؛ السلسلة الفرعية التالية ، تنتقل إلى الخلية 2 ؛ وما إلى ذلك وهلم جرا. يوضح الكود التالي هذا:

لو (regex_search('أفضل بائع كتب اليوم!'وموregex('بائع كتب))')))

كلفة<<م[0] <<endl؛

كلفة<<م[1] <<endl؛

كلفة<<م[2] <<endl؛

كلفة<<م[3] <<endl؛

الخرج هو:

بائع كتب

تاجر

زنزانة

اقرأ

لاحظ أن المجموعة (البائع) تأتي قبل المجموعة (sel).

موقف المباراة

يمكن معرفة موضع التطابق لكل سلسلة فرعية في مصفوفة cmatch. يبدأ العد من الحرف الأول من السلسلة الهدف ، عند الموضع صفر. يوضح الكود التالي هذا:

سماتش م؛

لو (regex_search('أفضل بائع كتب اليوم!'وموregex('بائع كتب))')))

كلفة<<م[0] << '->' <<م.موقع(0) <<endl؛

كلفة<<م[1] << '->' <<م.موقع(1) <<endl؛

كلفة<<م[2] << '->' <<م.موقع(2) <<endl؛

كلفة<<م[3] << '->' <<م.موقع(3) <<endl؛

لاحظ استخدام خاصية الموضع ، مع فهرس الخلية ، كوسيطة. الخرج هو:

بائع كتب->5

تاجر->9

زنزانة->9

اقرأ->12

البحث والاستبدال

يمكن أن تحل كلمة أو عبارة جديدة محل المطابقة. يتم استخدام وظيفة regex_replace () لهذا الغرض. ومع ذلك ، هذه المرة ، فإن السلسلة التي يحدث فيها الاستبدال هي كائن السلسلة ، وليس السلسلة الحرفية. لذلك ، يجب تضمين مكتبة السلسلة في البرنامج. توضيح:

#يشمل

#يشمل

#يشمل

استخدام اسم للمحطة؛

intالأساسية()
{
سلسلة سلسلة= 'هنا ، يأتي رجلي. هناك يذهب رجلك.؛
سلسلة newStr=regex_replace(صوregex('رجل')و 'النساء')؛
كلفة<<newStr<<endl؛

إرجاع 0؛
}

وظيفة regex_replace () ، كما تم ترميزها هنا ، تحل محل جميع التطابقات. الوسيطة الأولى للدالة هي الهدف ، والثانية هي كائن regex ، والثالثة هي سلسلة الاستبدال. تقوم الوظيفة بإرجاع سلسلة جديدة ، وهي الهدف ولكن لها البديل. الخرج هو:

هنا تأتي امرأتي. هناك تذهب امرأتك.

استنتاج

يستخدم التعبير العادي أنماطًا لمطابقة السلاسل الفرعية في سلسلة التسلسل الهدف. الأنماط لها أحرف أولية. الدوال شائعة الاستخدام لتعبيرات C ++ العادية هي: regex_search () و regex_match () و regex_replace (). Regex هو نمط في علامات الاقتباس المزدوجة. ومع ذلك ، فإن هذه الوظائف تأخذ كائن regex كوسيطة وليس مجرد regex. يجب تحويل regex إلى كائن regex قبل أن تتمكن هذه الوظائف من استخدامه.