C ++ میں باقاعدہ اظہار کی بنیادی باتیں۔

Regular Expression Basics C



اقتباسات میں درج ذیل جملے پر غور کریں:

'یہ ہے میرا آدمی۔'

یہ سٹرنگ کمپیوٹر کے اندر ہو سکتی ہے ، اور صارف جاننا چاہ سکتا ہے کہ آیا اس میں آدمی کا لفظ ہے۔ اگر اس میں مرد کا لفظ ہے تو وہ مرد کو عورت میں تبدیل کرنا چاہے گا۔ تاکہ تار پڑھنی چاہیے:







'یہ ہے میری عورت۔'

کمپیوٹر استعمال کرنے والے کی اس طرح کی بہت سی خواہشات ہیں کچھ پیچیدہ ہیں. ریگولر ایکسپریشن ، مختصرا ، ریجیکس ، کمپیوٹر کے ذریعہ ان مسائل کو سنبھالنے کا موضوع ہے۔ C ++ ایک لائبریری کے ساتھ آتا ہے جسے ریجیکس کہتے ہیں۔ لہذا ، ریجیکس کو سنبھالنے کے لئے ایک C ++ پروگرام شروع ہونا چاہئے:



#شامل کریں

#شامل کریں

نام کی جگہ کا استعمال کرتے ہوئے std؛

یہ مضمون C ++ میں باقاعدہ اظہار کی بنیادی باتوں کی وضاحت کرتا ہے۔



مضمون کا مواد۔

باقاعدہ اظہار کے بنیادی اصول

ریجیکس۔

یہاں کی طرح ایک تار میرا آدمی ہے۔ اوپر ہدف کی ترتیب یا ٹارگٹ سٹرنگ ہے یا صرف ، ہدف۔ آدمی ، جس کی تلاش کی گئی تھی ، وہ باقاعدہ اظہار ہے ، یا صرف ، ریجیکس۔





ملاپ

مماثلت اس وقت ہوتی ہے جب اس لفظ یا فقرے کو تلاش کیا جا رہا ہو جو واقع ہو۔ ملاپ کے بعد ، ایک متبادل جگہ لے سکتا ہے۔ مثال کے طور پر ، مرد کے اوپر واقع ہونے کے بعد ، اس کی جگہ عورت لے سکتی ہے۔

سادہ ملاپ۔

مندرجہ ذیل پروگرام سے پتہ چلتا ہے کہ انسان لفظ کس طرح مماثل ہے۔



#شامل کریں

#شامل کریں

نام کی جگہ کا استعمال کرتے ہوئے std؛

intمرکزی()
{

ریجیکس ریگ('آدمی')؛
اگر (regex_search('یہ ہے میرا آدمی۔'،reg))
لاگت<< 'مماثل' <<endl؛
اور
لاگت<< 'مماثل نہیں' <<endl؛

واپسی ؛
}

فنکشن regex_search () اگر کوئی میچ ہو تو سچ لوٹتا ہے اور اگر کوئی میچ نہیں ہوتا ہے تو غلط واپس کرتا ہے۔ یہاں ، فنکشن دو دلائل لیتا ہے: پہلا ٹارگٹ سٹرنگ ہے ، اور دوسرا ریجیکس آبجیکٹ ہے۔ ریجیکس خود 'انسان' ہے ، دوہرے حوالوں میں۔ مین () فنکشن میں پہلا بیان ریجیکس آبجیکٹ بناتا ہے۔ ریجیکس ایک قسم ہے ، اور ریج ریجیکس آبجیکٹ ہے۔ مذکورہ پروگرام کا آؤٹ پٹ 'مماثل' ہے ، جیسا کہ 'مین' ٹارگٹ سٹرنگ میں دیکھا جاتا ہے۔ اگر 'انسان' ہدف میں نہ دیکھا جاتا تو regex_search () غلط واپس آ جاتا ، اور پیداوار 'مماثل نہیں' ہوتی۔

مندرجہ ذیل کوڈ کی پیداوار مماثل نہیں ہے:

ریجیکس ریگ('آدمی')؛
اگر (regex_search('یہ ہے میری بنانا۔'،reg))
لاگت<< 'مماثل' <<endl؛
اور
لاگت<< 'مماثل نہیں' <<endl؛

مماثل نہیں کیونکہ ریجیکس 'مین' پورے ٹارگٹ سٹرنگ میں نہیں مل سکا ، 'یہ ہے میری بنانا۔'

پیٹرن

باقاعدہ اظہار ، اوپر والا آدمی ، بہت آسان ہے۔ ریجیکس عام طور پر اتنے آسان نہیں ہوتے ہیں۔ باقاعدہ اظہارات میں میٹا کریکٹر ہوتے ہیں۔ میٹا کریکٹر خاص معنی کے حامل کردار ہیں۔ میٹا کریکٹر کرداروں کے بارے میں ایک کردار ہے۔ C ++ ریجیکس میٹا کریکٹر ہیں:

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

ایک ریجیکس ، میٹا کریکٹرز کے ساتھ یا اس کے بغیر ، ایک نمونہ ہے۔

کریکٹر کلاسز

مربع بریکٹ

ایک پیٹرن میں مربع بریکٹ میں حروف ہو سکتے ہیں۔ اس کے ساتھ ، ٹارگٹ سٹرنگ میں ایک خاص پوزیشن مربع بریکٹ کے کسی بھی حرف سے مماثل ہوگی۔ مندرجہ ذیل اہداف پر غور کریں:

بلی کمرے میں ہے۔

چمگادڑ کمرے میں ہے۔

'چوہا کمرے میں ہے۔'

ریجیکس ، [cbr] پہلے ہدف میں بلی سے مماثل ہوگا۔ یہ دوسرے ہدف میں بیٹ سے میچ کرے گا۔ یہ تیسرے ہدف میں چوہے سے مماثل ہوگا۔ اس کی وجہ یہ ہے کہ ، بلی یا چمگادڑ یا چوہا 'c' یا 'b' یا 'r' سے شروع ہوتا ہے۔ مندرجہ ذیل کوڈ طبقہ اس کی وضاحت کرتا ہے:

ریجیکس ریگ('[cbr] at')؛
اگر (regex_search(بلی کمرے میں ہے۔،reg))
لاگت<< 'مماثل' <<endl؛
اگر (regex_search(چمگادڑ کمرے میں ہے۔،reg))
لاگت<< 'مماثل' <<endl؛
اگر (regex_search('چوہا کمرے میں ہے۔'،reg))
لاگت<< 'مماثل' <<endl؛

پیداوار یہ ہے:

مماثل

مماثل

مماثل

حروف کی حد۔

کلاس ، [cbr] پیٹرن [cbr] میں ، ہدف کے کئی ممکنہ حروف سے مماثل ہوگا۔ یہ ہدف میں 'c' یا 'b' یا 'r' سے مماثل ہوگا۔ اگر ہدف میں 'c' یا 'b' یا 'r' نہیں ہے تو اس کے بعد کوئی میچ نہیں ہوگا۔

کچھ امکانات جیسے 'c' یا 'b' یا 'r' ایک رینج میں موجود ہیں۔ ہندسوں کی حد ، 0 سے 9 کے 10 امکانات ہیں ، اور اس کا نمونہ [0-9] ہے۔ چھوٹے حروف کی حد ، a سے z تک ، 26 امکانات ہیں ، اور اس کا نمونہ [a-z] ہے۔ بڑے حروف تہجی کی حد ، A سے Z تک ، 26 امکانات ہیں ، اور اس کا نمونہ [A-Z] ہے۔ - سرکاری طور پر میٹا کریکٹر نہیں ہے ، لیکن مربع بریکٹ میں ، یہ ایک رینج کی نشاندہی کرے گا۔ تو ، مندرجہ ذیل ایک میچ پیدا کرتا ہے:

اگر (regex_search('ID6id'،ریجیکس('[0-9]')))

لاگت<< 'مماثل' <<endl؛

نوٹ کریں کہ ریجیکس کو دوسری دلیل کے طور پر کیسے بنایا گیا ہے۔ میچ ہندسے کے درمیان ، رینج میں 6 ، 0 سے 9 اور ہدف میں 6 ، ID6id کے درمیان ہوتا ہے۔ مندرجہ بالا کوڈ اس کے برابر ہے:

اگر (regex_search('ID6id'،ریجیکس('[0123456789]')))

لاگت<< 'مماثل' <<endl؛

مندرجہ ذیل کوڈ ایک میچ پیدا کرتا ہے:

چارp[] = 'ID6iE'؛

اگر (regex_search(p،ریجیکس('[a-z]')))

لاگت<< 'مماثل' <<endl؛

نوٹ کریں کہ یہاں پہلی دلیل ایک سٹرنگ متغیر ہے نہ کہ سٹرنگ لفظی۔ میچ [a-z] میں 'i' اور ID6iE میں 'i' کے درمیان ہے۔

مت بھولنا کہ ایک رینج ایک کلاس ہے۔ پیٹرن میں رینج کے دائیں یا رینج کے بائیں ٹیکسٹ ہو سکتا ہے۔ مندرجہ ذیل کوڈ ایک میچ پیدا کرتا ہے:

اگر (regex_search(ID2id۔ ایک شناخت ہے '،ریجیکس('ID [0-9] id')))

لاگت<< 'مماثل' <<endl؛

میچ ID [0-9] id اور ID2id کے درمیان ہے۔ باقی ٹارگٹ سٹرنگ ، ایک آئی ڈی ہے ، اس صورتحال میں مماثل نہیں ہے۔

جیسا کہ باقاعدہ اظہار کے موضوع (ریجیکس) میں استعمال ہوتا ہے ، لفظ کلاس کا اصل مطلب ایک سیٹ ہے۔ یعنی سیٹ میں سے ایک حرف مماثل ہے۔

نوٹ: ہائفن - صرف ایک مربع بریکٹ کے اندر ایک میٹا کریکٹر ہے ، جو ایک رینج کی نشاندہی کرتا ہے۔ یہ مربع بریکٹ کے باہر ، ریجیکس میں میٹا کریکٹر نہیں ہے۔

منفی

ایک کلاس بشمول رینج کی نفی کی جا سکتی ہے۔ یعنی ، سیٹ (کلاس) کے حروف میں سے غیر مماثل ہونا چاہئے۔ یہ کلاس پیٹرن کے آغاز میں ^ میٹا کریکٹر کے ساتھ اشارہ کیا گیا ہے ، مربع بریکٹ کھولنے کے فورا بعد۔ تو ، [^0-9] کا مطلب ہے کہ ہدف میں مناسب پوزیشن پر کردار کا ملاپ ، جو 0 سے 9 تک کی حد میں کوئی کردار نہیں ہے۔ تو مندرجہ ذیل کوڈ مماثلت پیدا نہیں کرے گا:

اگر (regex_search('0123456789101112'،ریجیکس('[^ 0-9]')))

لاگت<< 'مماثل' <<endl؛

اور

لاگت<< 'مماثل نہیں' <<endl؛

0 سے 9 کی حد کے اندر ایک ہندسہ ہدف کی سٹرنگ پوزیشنوں میں سے کسی میں بھی پایا جا سکتا ہے ، 0123456789101112 ، تو کوئی مماثلت نہیں ہے - نفی۔

مندرجہ ذیل کوڈ ایک میچ پیدا کرتا ہے:

اگر (regex_search('ABCDEFGHIJ'،ریجیکس('[^ 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('ایک لائن کی۔ rnلائن دو کی۔ '،ریجیکس('n')))

لاگت<< 'مماثل' <<endl؛

کسی بھی وائٹ اسپیس کردار سے مماثل۔

کسی بھی سفید جگہ کے کردار سے ملنے کے لیے پیٹرن یا کلاس ، [ t r n f] ہے۔ مندرجہ ذیل کوڈ میں ، '' مماثل ہے:

اگر (regex_search('ایک دو'،ریجیکس('[ٹی rn f] ')))

لاگت<< 'مماثل' <<endl؛

کسی بھی وائٹ اسپیس کریکٹر سے مماثل

کسی بھی غیر سفید خلائی کردار سے ملنے کے لیے پیٹرن یا کلاس ، [ t r n f] ہے۔ مندرجہ ذیل کوڈ ایک میچ پیدا کرتا ہے کیونکہ ہدف میں کوئی وائٹ اسپیس نہیں ہے:

اگر (regex_search('1234abcd'،ریجیکس('[ٹی rn f] ')))

لاگت<< 'مماثل' <<endl؛

پیٹرن میں مدت (.)

پیٹرن میں مدت (.) ہدف میں itself n کو چھوڑ کر اپنے سمیت کسی بھی کردار سے ملتی ہے۔ مندرجہ ذیل کوڈ میں ایک میچ تیار کیا جاتا ہے:

اگر (regex_search('1234abcd'،ریجیکس('.')))

لاگت<< 'مماثل' <<endl؛

مندرجہ ذیل کوڈ میں کوئی مماثل نتیجہ نہیں ہے کیونکہ ہدف n ہے۔

اگر (regex_search('n'،ریجیکس('.')))

لاگت<< 'مماثل' <<endl؛

اور

لاگت<< 'مماثل نہیں' <<endl؛

نوٹ: مربع بریکٹ کے ساتھ ایک کریکٹر کلاس کے اندر ، مدت کا کوئی خاص مطلب نہیں ہے۔

مماثل تکرار۔

ایک کردار یا حروف کا ایک گروپ ہدف کے تار میں ایک سے زیادہ بار ہو سکتا ہے۔ ایک پیٹرن اس تکرار سے مل سکتا ہے۔ میٹا کریکٹر ،؟ ، *، +، اور {} ہدف میں تکرار سے ملنے کے لیے استعمال ہوتے ہیں۔ اگر x ٹارگٹ سٹرنگ میں دلچسپی کا ایک کردار ہے ، تو میٹا کریکٹرز کے مندرجہ ذیل معنی ہیں:

ایکس*:مطلب میچ۔'ایکس' یا زیادہ بار،میں.اور.،کسی بھی وقت

ایکس+:مطلب میچ۔'ایکس' یا زیادہ بار،میں.اور.،کم از کم ایک بار

ایکس؟ :مطلب میچ۔'ایکس' یا وقت

ایکس{n،}:مطلب میچ۔'ایکس'کم از کم ن یا اس سے زیادہ بار۔نوٹکوما

ایکس{n} :میچ'ایکس'بالکل ن اوقات

ایکس{n،m}:میچ'ایکس'کم از کم ن اوقات،لیکن m اوقات سے زیادہ نہیں۔

یہ میٹا کریکٹر کہلاتے ہیں۔ مقدار

تمثیلیں۔

*

* سابقہ ​​کردار یا سابقہ ​​گروپ سے میل کھاتا ہے ، صفر یا اس سے زیادہ بار۔ o* ٹارگٹ سٹرنگ کے کتے میں 'o' سے ملتا ہے۔ یہ کتاب اور تلاش میں بھی مماثل ہے۔ ریجیکس ، o* جانوروں کے بوو میں بوو سے ملتا ہے .. نوٹ: o* میچ کھودتا ہے ، جہاں 'o' صفر (یا زیادہ) وقت ہوتا ہے۔

+

+ سابقہ ​​کردار یا سابقہ ​​گروپ ، 1 یا اس سے زیادہ بار مماثل ہے۔ اس کے برعکس صفر یا اس سے زیادہ بار *کے ساتھ۔ تو ریجیکس ، e+ کھانے میں 'e' سے ملتا ہے ، جہاں 'e' ایک بار ہوتا ہے۔ e+ بھیڑ میں ee سے ملتا ہے ، جہاں 'e' ایک سے زیادہ بار ہوتا ہے۔ نوٹ: ای+ ڈی آئی جی سے مماثل نہیں ہوگا کیونکہ ڈگ میں ، 'ای' کم از کم ایک بار نہیں ہوتا ہے۔

؟

کا؟ سابقہ ​​کردار یا سابقہ ​​گروپ ، 0 یا 1 بار (اور زیادہ نہیں) سے مماثل ہے۔ تو ، ای؟ میچز کھودتے ہیں کیونکہ 'ای' کھود ، صفر وقت میں ہوتا ہے۔ ای؟ میچز سیٹ ہوتے ہیں کیونکہ 'e' سیٹ میں ہوتا ہے ، ایک بار۔ نوٹ: ای؟ اب بھی بھیڑوں سے ملتا ہے اگرچہ بھیڑوں میں دو ’ای‘ ہیں۔ یہاں ایک اہمیت ہے - بعد میں دیکھیں۔

{n ،}

یہ پچھلے کردار یا سابقہ ​​گروپ کی کم از کم مسلسل تکرار سے مماثل ہے۔ تو ریجیکس ، ای {2 ،} ہدف میں دو 'ای' ، بھیڑ اور تین 'ای' ٹارگٹ شیپ میں مماثل ہیں۔ ای {2 ،} سیٹ سے مماثل نہیں ہے ، کیونکہ سیٹ میں صرف ایک 'ای' ہے۔

{n}

یہ کسی سابقہ ​​کردار یا پچھلے گروپ کی بالکل مسلسل تکرار سے مماثل ہے۔ تو ریجیکس ، ای {2} ہدف میں دو 'ای' ، بھیڑوں سے مماثل ہے۔ e {2} سیٹ سے مماثل نہیں ہے کیونکہ سیٹ میں صرف ایک 'e' ہے۔ ٹھیک ہے ، ای {2} ہدف میں دو 'ای' سے ملتا ہے ، شیپ۔ یہاں ایک اہمیت ہے - بعد میں دیکھیں۔

{این ، ایم}

یہ پچھلے کردار یا پچھلے گروپ کی متعدد مسلسل تکرار سے مماثل ہے ، کہیں بھی n سے m تک ، بشمول۔ تو ، ای {1،3} کھود میں کچھ بھی نہیں ملتا ، جس میں کوئی 'ای' نہیں ہے۔ یہ سیٹ میں ایک 'ای' ، دو 'ای' بھیڑوں میں ، تین 'ای' شیپ میں ، اور تین 'ای' بھیڑ میں ہے۔ آخری میچ میں ایک اہمیت ہے - بعد میں دیکھیں۔

مماثل متبادل۔

کمپیوٹر میں درج ذیل ٹارگٹ سٹرنگ پر غور کریں۔

فارم میں مختلف سائز کے خنزیر ہیں۔

پروگرامر جاننا چاہے گا کہ اس ہدف میں بکری ہے یا خرگوش یا سور۔ کوڈ مندرجہ ذیل ہو گا:

چارp[] = 'فارم میں مختلف سائز کے خنزیر ہیں۔'؛

اگر (regex_search(p،ریجیکس('بکری | خرگوش | سور')))

لاگت<< 'مماثل' <<endl؛

اور

لاگت<< 'مماثل نہیں' <<endl؛

کوڈ ایک میچ پیدا کرتا ہے۔ متبادل کردار کے استعمال کو نوٹ کریں ، |. دو ، تین ، چار ، اور زیادہ اختیارات ہو سکتے ہیں۔ C ++ سب سے پہلے ٹارگٹ سٹرنگ میں ہر کردار کی پوزیشن پر پہلے متبادل ، بکری سے ملنے کی کوشش کرے گا۔ اگر یہ بکری کے ساتھ کامیاب نہیں ہوتا ہے ، تو یہ اگلے متبادل خرگوش کی کوشش کرتا ہے۔ اگر یہ خرگوش کے ساتھ کامیاب نہیں ہوتا ہے تو ، یہ اگلے متبادل ، سور کی کوشش کرتا ہے۔ اگر سور ناکام ہوجاتا ہے ، تو C ++ ہدف میں اگلی پوزیشن پر چلا جاتا ہے اور پہلے متبادل کے ساتھ دوبارہ شروع ہوتا ہے۔

مذکورہ کوڈ میں ، سور مماثل ہے۔

میچ کا آغاز یا اختتام۔

آغاز


اگر the ریجیکس کے آغاز میں ہے ، تو ہدف کے سٹرنگ کے ابتدائی متن کو ریجیکس سے ملایا جاسکتا ہے۔ مندرجہ ذیل کوڈ میں ، ہدف کا آغاز abc ہے ، جو مماثل ہے:

اگر (regex_search('اے بی سی اور ڈیف'،ریجیکس('^ abc')))

لاگت<< 'مماثل' <<endl؛

مندرجہ ذیل کوڈ میں کوئی مماثلت نہیں ہوتی:

اگر (regex_search('ہاں ، اے بی سی اور ڈیف'،ریجیکس('^ abc')))

لاگت<< 'مماثل' <<endl؛

اور

لاگت<< 'مماثل نہیں' <<endl؛

یہاں ، abc ہدف کے آغاز میں نہیں ہے۔

نوٹ: سرکس فلیکس کردار ، '^' ، ریجیکس کے آغاز میں ایک میٹا کریکٹر ہے ، جو ہدف کے تار کے آغاز سے ملتا ہے۔ یہ اب بھی کریکٹر کلاس کے آغاز میں ایک میٹا کریکٹر ہے ، جہاں یہ کلاس کی نفی کرتا ہے۔

ختم

اگر $ ریجیکس کے اختتام پر ہے ، تو ہدف کے تار کا اختتامی متن ریجیکس کے ذریعہ مماثل ہوسکتا ہے۔ مندرجہ ذیل کوڈ میں ، ہدف کا اختتام xyz ہے ، جو مماثل ہے:

اگر (regex_search('uvw اور xyz'،ریجیکس('xyz $')))

لاگت<< 'مماثل' <<endl؛

مندرجہ ذیل کوڈ میں کوئی مماثلت نہیں ہوتی:

اگر (regex_search('uvw اور xyz فائنل'،ریجیکس('xyz $')))

لاگت<< 'مماثل' <<endl؛

اور

لاگت<< 'مماثل نہیں' <<endl؛

یہاں ، xyz ہدف کے اختتام پر نہیں ہے۔

گروہ بندی۔

قوسین کو ایک نمونہ میں حروف کو گروپ کرنے کے لیے استعمال کیا جا سکتا ہے۔ درج ذیل ریجیکس پر غور کریں:

'ایک کنسرٹ (پیانو بجانے والا)'

یہاں کا گروپ پیانوادک ہے جس کے چاروں طرف میٹا کریکٹرز (اور) ہیں۔ یہ دراصل ایک ذیلی گروپ ہے ، جبکہ ایک کنسرٹ (پیانو بجانے والا) پورا گروپ ہے۔ درج ذیل پر غور کریں:

'(پیانو بجانے والا اچھا ہے)'

یہاں ، سب گروپ یا سب سٹرنگ ہے ، پیانو بجانا اچھا ہے۔

مشترکہ حصوں کے ساتھ ذیلی تاریں۔

بک مارک وہ شخص ہے جو کتابوں کا خیال رکھتا ہے۔ ایک لائبریری کا تصور کریں جس میں ایک بک کیپر اور کتابوں کی الماری ہے۔ فرض کریں کہ مندرجہ ذیل ٹارگٹ ڈور میں سے ایک کمپیوٹر میں ہے:

'لائبریری میں ایک کتابوں کی الماری ہے جو قابل تعریف ہے۔'

'یہ ہے بک مارک'۔

'بک کیپر بک شیلف کے ساتھ کام کرتا ہے۔'

فرض کریں کہ پروگرامر کی دلچسپی یہ جاننا نہیں ہے کہ ان جملوں میں سے کون سا کمپیوٹر میں ہے۔ پھر بھی ، اس کی دلچسپی یہ جاننا ہے کہ کمپیوٹر میں جو بھی ٹارگٹ سٹرنگ ہے اس میں بک شیلف یا بک کیپر موجود ہے۔ اس معاملے میں ، اس کا ریجیکس یہ ہوسکتا ہے:

کتابوں کی شیلف

متبادل کا استعمال۔

نوٹ کریں کہ وہ کتاب ، جو دونوں الفاظ میں مشترک ہے ، پیٹرن میں دو الفاظ میں دو بار ٹائپ کی گئی ہے۔ دو بار کتاب ٹائپ کرنے سے بچنے کے لیے ، ریجیکس بہتر لکھا جائے گا:

'کتاب (شیلف | کیپر)'

یہاں ، گروپ ، شیلف | کیپر اب بھی متبادل میٹا کریکٹر استعمال کیا گیا ہے ، لیکن دو لمبے الفاظ کے لیے نہیں۔ یہ دو لمبے الفاظ کے دو اختتامی حصوں کے لیے استعمال ہوا ہے۔ C ++ ایک گروہ کو ایک ہستی کے طور پر مانتا ہے۔ لہذا ، C ++ شیلف یا کیپر تلاش کرے گا جو کتاب کے فورا بعد آتا ہے۔ مندرجہ ذیل کوڈ کی پیداوار مماثل ہے:

چارp[] = 'لائبریری میں ایک کتابوں کی الماری ہے جو قابل تعریف ہے۔'؛

اگر (regex_search(p،ریجیکس('کتاب (شیلف | کیپر)')))

لاگت<< 'مماثل' <<endl؛

کتابوں کی شیلف اور بک کیپر کا مماثل نہیں ہے۔

icase اور multiline regex_constants

آئیکیس

میچنگ ڈیفالٹ کیس حساس ہے۔ تاہم ، اسے کیس بے حس بنایا جا سکتا ہے۔ اس کو حاصل کرنے کے لیے ، regex :: icase constant استعمال کریں ، جیسا کہ درج ذیل کوڈ میں ہے:

اگر (regex_search('تاثرات'،ریجیکس('کھانا کھلانا'،ریجیکس::آئیکیس)))

لاگت<< 'مماثل' <<endl؛

آؤٹ پٹ مماثل ہے۔ لہذا بڑے حرف 'F' کے ساتھ تاثرات کو چھوٹے حرف 'f' کے ساتھ فیڈ سے ملایا گیا ہے۔ regex :: icase کو regex () کنسٹرکٹر کی دوسری دلیل بنایا گیا ہے۔ اس کے بغیر ، بیان ایک مماثلت پیدا نہیں کرے گا۔

ملٹی لائن۔

درج ذیل کوڈ پر غور کریں:

چارp[] = 'لائن 1nلائن 2nلائن 3 '؛

اگر (regex_search(p،ریجیکس('^. * $')))

لاگت<< 'مماثل' <<endl؛

اور

لاگت<< 'مماثل نہیں' <<endl؛

آؤٹ پٹ مماثل نہیں ہے۔ ریجیکس ، ^.*$ ، ٹارگٹ سٹرنگ کو شروع سے لے کر آخر تک مماثل ہے۔ .* کا مطلب ہے کوئی بھی کردار سوائے n ، صفر یا اس سے زیادہ بار۔ لہذا ، ہدف میں نیو لائن حروف ( n) کی وجہ سے ، کوئی مماثل نہیں تھا۔

ہدف ایک ملٹی لائن ہے۔ '.' کو نئے لائن کے کردار سے ملانے کے لیے ، مسلسل ریجیکس :: ملٹی لائن بنانا پڑتی ہے ، ریجیکس () تعمیر کی دوسری دلیل۔ مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

چارp[] = 'لائن 1nلائن 2nلائن 3 '؛

اگر (regex_search(p،ریجیکس('^. * $'،ریجیکس::ملٹی لائن)))

لاگت<< 'مماثل' <<endl؛

اور

لاگت<< 'مماثل نہیں' <<endl؛

پورے ٹارگٹ سٹرنگ سے مماثل۔

پورے ٹارگٹ سٹرنگ سے ملنے کے لیے ، جس میں نیو لائن کریکٹر ( n) نہیں ہے ، regex_match () فنکشن استعمال کیا جا سکتا ہے۔ یہ فنکشن regex_search () سے مختلف ہے۔ مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

چارp[] = 'پہلی دوسری تیسری'؛

اگر (regex_match(p،ریجیکس(*.*دوسرا.*')))

لاگت<< 'مماثل' <<endl؛

یہاں ایک میچ ہے۔ تاہم ، نوٹ کریں کہ ریجیکس پورے ٹارگٹ سٹرنگ سے مماثل ہے ، اور ٹارگٹ سٹرنگ میں کوئی ' n' نہیں ہے۔

match_results آبجیکٹ۔

regex_search () فنکشن ہدف اور ریجیکس آبجیکٹ کے درمیان دلیل لے سکتا ہے۔ یہ دلیل match_results آبجیکٹ ہے۔ پوری مماثل (جزوی) تار اور مماثل ذیلی تاریں اس کے ساتھ جانی جاسکتی ہیں۔ یہ شے طریقوں کے ساتھ ایک خاص صف ہے۔ match_results آبجیکٹ کی قسم cmatch ہے (سٹرنگ لیٹرلز کے لیے)۔

مماثلتیں حاصل کرنا۔

درج ذیل کوڈ پر غور کریں:

چارp[] = 'جس عورت کو تم ڈھونڈ رہے تھے!'؛

cmatch m؛

اگر (regex_search(p،m،ریجیکس('w.m.n')))

لاگت<<m[] <<endl؛

ہدف کے تار میں عورت کا لفظ ہے۔ پیداوار عورت ہے ، جو ریجیکس ، w.m.n سے مماثل ہے۔ انڈیکس صفر پر ، خاص صف میں واحد میچ ہوتا ہے ، جو کہ عورت ہے۔

کلاس آپشنز کے ساتھ ، ہدف میں پائی جانے والی صرف پہلی سب سٹرنگ ، خاص صف میں بھیجی جاتی ہے۔ مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

cmatch m؛

اگر (regex_search('چوہا ، بلی ، چمگادڑ!'،m،ریجیکس('[bcr] at')))

لاگت<<m[] <<endl؛

لاگت<<m[] <<endl؛

لاگت<<m[] <<endl؛

پیداوار انڈیکس صفر سے چوہا ہے۔ m [1] اور m [2] خالی ہیں۔

متبادل کے ساتھ ، ہدف میں پائی جانے والی صرف پہلی سب سٹرنگ ، خاص صف میں بھیجی جاتی ہے۔ مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

اگر (regex_search('خرگوش ، بکری ، سور!'،m،ریجیکس('بکری | خرگوش | سور')))

لاگت<<m[] <<endl؛

لاگت<<m[] <<endl؛

لاگت<<m[] <<endl؛

پیداوار انڈیکس صفر سے خرگوش ہے۔ m [1] اور m [2] خالی ہیں۔

گروہ بندی۔

جب گروپ شامل ہوتے ہیں ، مکمل پیٹرن مماثل ہوتا ہے ، خاص صف کے سیل زیرو میں جاتا ہے۔ اگلی سب سٹرنگ سیل 1 میں جاتی ہے۔ ذیلی تار مندرجہ ذیل ، سیل 2 میں جاتا ہے اور اسی طرح. مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

اگر (regex_search(آج کا بہترین کتاب فروش!،m،ریجیکس('کتاب ((سیل) (لیر))')))

لاگت<<m[] <<endl؛

لاگت<<m[] <<endl؛

لاگت<<m[] <<endl؛

لاگت<<m[] <<endl؛

پیداوار یہ ہے:

کتاب فروش

بیچنے والے

سیل

پڑھیں

نوٹ کریں کہ گروپ (بیچنے والا) گروپ (سیل) سے پہلے آتا ہے۔

میچ کی پوزیشن۔

cmatch array میں ہر سب سٹرنگ کے لیے میچ کی پوزیشن معلوم کی جا سکتی ہے۔ پوزیشن صفر پر ، ہدف تار کے پہلے حرف سے گنتی شروع ہوتی ہے۔ مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

cmatch m؛

اگر (regex_search(آج کا بہترین کتاب فروش!،m،ریجیکس('کتاب ((سیل) (لیر))')))

لاگت<<m[] << '->' <<mپوزیشن() <<endl؛

لاگت<<m[] << '->' <<mپوزیشن() <<endl؛

لاگت<<m[] << '->' <<mپوزیشن() <<endl؛

لاگت<<m[] << '->' <<mپوزیشن() <<endl؛

بطور دلیل سیل انڈیکس کے ساتھ پوزیشن پراپرٹی کے استعمال کو نوٹ کریں۔ پیداوار یہ ہے:

کتاب فروش->

بیچنے والے->

سیل->

پڑھیں->12۔

تلاش کریں اور تبدیل کریں۔

ایک نیا لفظ یا فقرہ میچ کی جگہ لے سکتا ہے۔ regex_replace () فنکشن اس کے لیے استعمال ہوتا ہے۔ تاہم ، اس بار ، سٹرنگ جہاں متبادل ہوتی ہے وہ سٹرنگ آبجیکٹ ہوتی ہے ، سٹرنگ لٹریل نہیں۔ لہذا ، سٹرنگ لائبریری کو پروگرام میں شامل کرنا ہوگا۔ مثال:

#شامل کریں

#شامل کریں

#شامل کریں

نام کی جگہ کا استعمال کرتے ہوئے std؛

intمرکزی()
{
سٹرنگ= 'یہاں ، میرا آدمی آتا ہے۔ آپ کا آدمی وہاں جاتا ہے۔؛
string newStr=regex_replace(p،ریجیکس('آدمی')، 'عورت')؛
لاگت<<newStr<<endl؛

واپسی ؛
}

regex_replace () فنکشن ، جیسا کہ یہاں کوڈ کیا گیا ہے ، تمام میچوں کی جگہ لے لیتا ہے۔ فنکشن کی پہلی دلیل ہدف ہے ، دوسری ریجیکس آبجیکٹ ہے ، اور تیسری متبادل سٹرنگ ہے۔ فنکشن ایک نئی تار واپس کرتا ہے ، جو ہدف ہے لیکن اس کا متبادل ہے۔ پیداوار یہ ہے:

یہاں میری عورت آئی ہے۔ آپ کی عورت وہاں جاتی ہے۔

نتیجہ

ریگولر ایکسپریشن پیٹرن کا استعمال کرتا ہے تاکہ ٹارگٹ سیونس سٹرنگ میں سبٹرنگز کو ملایا جا سکے۔ پیٹرن میں میٹا کریکٹر ہوتے ہیں۔ C ++ باقاعدہ تاثرات کے لیے عام طور پر استعمال ہونے والے افعال یہ ہیں: regex_search () ، regex_match () اور regex_replace ()۔ ایک ریجیکس ڈبل حوالوں میں ایک نمونہ ہے۔ تاہم ، یہ افعال ریجیکس آبجیکٹ کو بطور دلیل لیتے ہیں نہ کہ ریجیکس۔ ریجیکس کو ریجیکس آبجیکٹ بنانا ضروری ہے اس سے پہلے کہ یہ افعال اسے استعمال کرسکیں۔