JavaRush /جاوا بلاگ /Random-UR /RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مخ...
Artur
سطح
Tallinn

RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔ حصہ 4

گروپ میں شائع ہوا۔
RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔ حصہ 1 RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔ حصہ 2 ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے 20 مختصر اقدامات۔ حصہ 3 یہ آخری حصہ، درمیان میں، ان چیزوں کو چھوئے گا جو بنیادی طور پر ریگولر ایکسپریشن ماسٹرز استعمال کرتے ہیں۔ لیکن پچھلے حصوں سے مواد آپ کے لئے آسان تھا، ٹھیک ہے؟ اس کا مطلب ہے کہ آپ اس مواد کو اسی آسانی سے سنبھال سکتے ہیں! اصل یہاں RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔  حصہ 4 - 1 <h2>مرحلہ 16: کیپچر کیے بغیر گروپس (?:)</h2> RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔  حصہ 4 - 2پچھلے مرحلے میں دو مثالوں میں، ہم متن کو کیپچر کر رہے تھے جس کی ہمیں واقعی ضرورت نہیں تھی۔ فائل سائز ٹاسک میں، ہم نے فائل سائز کے پہلے ہندسے سے پہلے خالی جگہوں کو حاصل کیا، اور CSV ٹاسک میں، ہم نے ہر ٹوکن کے درمیان کوما کیپچر کیا۔ ہمیں ان حروف کو کیپچر کرنے کی ضرورت نہیں ہے، لیکن ہمیں اپنے ریگولر ایکسپریشن کی تشکیل کے لیے انہیں استعمال کرنے کی ضرورت ہے۔ کیپچر کیے بغیر گروپ کو استعمال کرنے کے لیے یہ مثالی اختیارات ہیں، (?:). ایک نان کیپچر کرنے والا گروپ بالکل وہی کرتا ہے جو اسے لگتا ہے - یہ حروف کو گروپ کرنے اور ریگولر ایکسپریشنز میں استعمال کرنے کی اجازت دیتا ہے، لیکن انہیں نمبر والے گروپ میں نہیں پکڑتا:
پیٹرن: (?:")([^"]+)(?:") 
سٹرنگ: مجھے صرف "ان اقتباسات کے اندر کا متن" چاہیے ۔
میچز:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:                 11111111111111111111111111111    
( مثال ) ریگولر ایکسپریشن اب حوالہ کردہ متن کے ساتھ ساتھ خود اقتباس کے حروف سے بھی میل کھاتا ہے، لیکن کیپچر گروپ نے صرف اقتباس کردہ متن کو کیپچر کیا۔ ہم ایسا کیوں کریں؟ نقطہ یہ ہے کہ زیادہ تر ریگولر ایکسپریشن انجن آپ کو اپنے ریگولر ایکسپریشنز میں بیان کردہ کیپچر گروپس سے ٹیکسٹ بازیافت کرنے کی اجازت دیتے ہیں۔ اگر ہم اپنے کیپچر گروپس میں شامل کیے بغیر ان اضافی حروف کو تراش سکتے ہیں جن کی ہمیں ضرورت نہیں ہے، تو اس سے بعد میں متن کو پارس کرنا اور ہیرا پھیری کرنا آسان ہو جائے گا۔ پچھلے مرحلے سے CSV پارسر کو صاف کرنے کا طریقہ یہاں ہے:
پیٹرن: (?:^|،)\s*(?:\"([^",]*)\"|([^", ]*)) 
اسٹرنگ:   a ، " b "، " cde , f , " gh " , dfgi ,, k , "", l 
مماثلتیں: ^^^^^^^^^^^^^^^^ 
گروپ:    2 1 111 2 2 111 2222 2 2    
( مثال ) <mark>یہاں نوٹ کرنے کے لیے کچھ چیزیں ہیں:</mark> سب سے پہلے، ہم اب کوما کیپچر نہیں کر رہے ہیں کیونکہ ہم نے کیپچر کرنے والے گروپ کو (^|,)غیر کیپچر کرنے والے گروپ میں تبدیل کر دیا ہے (?:^|,)۔ دوسرا، ہم نے کیپچر گروپ کو نان کیپچر گروپ کے اندر اندر بنایا۔ یہ اس وقت مفید ہے جب، مثال کے طور پر، آپ کو ایک مخصوص ترتیب میں ظاہر ہونے کے لیے حروف کے ایک گروپ کی ضرورت ہے، لیکن آپ کو صرف ان حروف کے ذیلی سیٹ کی پرواہ ہے۔ ہمارے معاملے میں، ہمیں اقتباسات میں ظاہر ہونے کے لیے غیر اقتباس والے حروف اور غیر کوما کی ضرورت تھی [^",]*، لیکن ہمیں اصل میں خود اقتباس کے حروف کی ضرورت نہیں تھی، اس لیے انہیں کیپچر کرنے کی ضرورت نہیں تھی۔ آخر میں، <mark>نوٹ</mark> کہ اوپر دی گئی مثال میں حروف kاور کے درمیان صفر کی لمبائی کا مماثلت بھی ہے l۔ اقتباسات ""تلاش کردہ ذیلی اسٹرنگ ہیں، لیکن اقتباسات کے درمیان کوئی حروف نہیں ہیں، لہذا مماثل ذیلی اسٹرنگ میں کوئی حروف نہیں ہیں (صفر لمبائی)۔ <h3>کیا ہم اپنے علم کو مضبوط کریں؟ یہاں ڈھائی کام ہیں جو اس میں ہماری مدد کریں گے:</h3> نان کیپچرنگ گروپس (اور کیپچرنگ گروپس، اور کریکٹر کلاسز وغیرہ) کا استعمال کرتے ہوئے، ایک ریگولر ایکسپریشن لکھیں جو لائن پر صرف مناسب طریقے سے فارمیٹ شدہ فائل سائز کو کیپچر کرے۔ ذیل میں:
پیٹرن:
سٹرنگ:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB
میچز: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
گروپ:    11111 1111 11111 111    
( حل ) ایچ ٹی ایم ایل اوپننگ ٹیگز کے ساتھ شروع ہوتے ہیں <اور ختم ہوتے ہیں >۔ ایچ ٹی ایم ایل کے اختتامی ٹیگز حروف کی ترتیب سے شروع ہوتے ہیں </اور حرف کے ساتھ ختم ہوتے ہیں >۔ ٹیگ کا نام ان حروف کے درمیان موجود ہے۔ کیا آپ مندرجہ ذیل ٹیگز میں صرف ناموں کو کیپچر کرنے کے لیے باقاعدہ اظہار لکھ سکتے ہیں؟ (آپ غیر کیپچرنگ گروپس کا استعمال کیے بغیر اس مسئلے کو حل کرنے کے قابل ہوسکتے ہیں۔ اسے دو طریقوں سے حل کرنے کی کوشش کریں! ایک بار گروپوں کے ساتھ اور ایک بار بغیر۔)
پیٹرن:
string:   <p> </span> <div> </kbd> <link> 
مماثلتیں: ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:    1 1111 111 111 1111    
حل _ _ _ _ \N_ RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔  حصہ 4 - 3_ دردِ دل کی طرف لے جاتا ہے، یہ آخری مثال زیادہ تر ریگولر ایکسپریشنز کی ایک اور (بعض اوقات) کارآمد خصوصیت میں ایک اچھی سیگ ہے: بیک حوالہ۔ بیک لنکس دہرائے جانے والے گروپس کی طرح ہیں جہاں آپ ایک ہی متن کو دو بار پکڑنے کی کوشش کر سکتے ہیں۔ لیکن وہ ایک اہم پہلو میں مختلف ہیں - وہ صرف ایک ہی متن پر قبضہ کریں گے، کردار کے لحاظ سے۔ جب کہ دہرانے والا گروپ ہمیں کچھ اس طرح کی گرفت کرنے کی اجازت دے گا:
پیٹرن: (he(?:[az])+) 
string:   heyabcdefg hey heyo heyellow heyyyyyyyy 
مماثلتیں: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ 
گروپ:    1111111111 111 1111 11111111 111111111111    
( مثال کے طور پر ) ... پھر بیک لنک صرف اس سے مماثل ہوگا:
پیٹرن: (he([az])(\2+)) 
اسٹرنگ: heyabcdefg hey heyo heyellow heyyyyyyyyyy 
:                              ^^^^^^^^^^^^ 
گروپ:                                 11233333333    
( مثال ) کیپچر گروپس کو دہرانا مفید ہے جب آپ ایک ہی پیٹرن کو بار بار ملانا چاہتے ہیں، جب کہ بیک لنکس اچھے ہوتے ہیں جب آپ ایک ہی متن سے مماثل ہونا چاہتے ہیں۔ مثال کے طور پر، ہم مماثل اوپننگ اور کلوزنگ HTML ٹیگز تلاش کرنے کے لیے بیک لنک استعمال کر سکتے ہیں:
پیٹرن: <(\w+)[^>]*>[^<]+<\/\1> 
string:   <span style="color: red">Hey</span> 
مماثلتیں: ^^^^^^^ ^^^^^^^^^^^ 
گروپ:    1111    
( مثال ) <mark>براہ کرم نوٹ کریں</mark> کہ یہ ایک انتہائی آسان مثال ہے اور میں سختی سے مشورہ دیتا ہوں کہ آپ ریگولر ایکسپریشن پر مبنی HTML پارسر لکھنے کی کوشش نہ کریں۔ یہ بہت پیچیدہ نحو ہے اور غالباً آپ کو بیمار کر دے گا۔ نامزد کیپچر گروپس بیک لنکس سے بہت ملتے جلتے ہیں، اس لیے میں یہاں مختصراً ان کا احاطہ کروں گا۔ بیک ریفرینس اور نامزد کیپچر گروپ کے درمیان فرق صرف یہ ہے کہ... ایک نامزد کیپچر گروپ کا ایک نام ہوتا ہے:
پیٹرن: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
string:   <span style="color: red">ارے< </span> 
مماثلتیں: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:    1111    
( مثال ) آپ (?<name>...) یا (?'name'...) نحو (.NET-مطابقت پذیر ریگولر ایکسپریشن) یا اس نحو (?P<name>) کا استعمال کرتے ہوئے ایک نامزد کیپچرنگ گروپ بنا سکتے ہیں۔ ..) یا (؟P'name'...) (Python کے موافق ریگولر ایکسپریشن)۔ چونکہ ہم PCRE (Perl Compatible Regular Expression) استعمال کر رہے ہیں جو دونوں ورژن کو سپورٹ کرتا ہے، ہم یہاں کسی ایک کو بھی استعمال کر سکتے ہیں۔ (جاوا 7 نے .NET نحو کو کاپی کیا، لیکن صرف زاویہ بریکٹ ورژن۔ مترجم کا نوٹ) ایک نامزد کیپچرنگ گروپ کو بعد میں باقاعدہ اظہار میں دہرانے کے لیے، ہم \<kname> یا \k'name' (.NET) یا (? P = نام) (ازگر)۔ ایک بار پھر، PCRE ان تمام مختلف اختیارات کی حمایت کرتا ہے۔ آپ یہاں نامزد کیپچر گروپس کے بارے میں مزید پڑھ سکتے ہیں ، لیکن یہ وہ چیز تھی جو آپ کو واقعی ان کے بارے میں جاننے کی ضرورت ہے۔ <h3>ہماری مدد کرنے کا کام:</h3> اس شخص کا نام یاد رکھنے میں میری مدد کے لیے بیک لنکس استعمال کریں۔
پیٹرن:
تار: "ہیلو میرا نام جو ہے۔" [بعد میں] "اس لڑکے کا نام کیا ہے؟ جو ؟"
میچز:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ 
گروپ:                  111    
( حل ) <h2>مرحلہ 18: آگے دیکھو اور پیچھے دیکھو</h2> RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔  حصہ 4 - 4اب ہم ریگولر ایکسپریشنز کی کچھ جدید خصوصیات پر غور کریں گے۔ میں مرحلہ 16 تک ہر چیز کو اکثر استعمال کرتا ہوں۔ لیکن یہ آخری چند اقدامات صرف ان لوگوں کے لیے ہیں جو انتہائی پیچیدہ تاثرات سے ملنے کے لیے regex کو بہت سنجیدگی سے استعمال کرتے ہیں۔ دوسرے لفظوں میں، ریگولر ایکسپریشنز کے مالک۔ "آگے دیکھنا" اور "پیچھے کی طرف دیکھنا" کافی پیچیدہ لگ سکتا ہے، لیکن یہ واقعی زیادہ پیچیدہ نہیں ہیں۔ وہ آپ کو کچھ ایسا کرنے کی اجازت دیتے ہیں جیسا کہ ہم نے پہلے نان کیپچر کرنے والے گروپوں کے ساتھ کیا تھا - چیک کریں کہ آیا اس سے پہلے یا اس کے فوراً بعد کوئی متن موجود ہے جس سے ہم میچ کرنا چاہتے ہیں۔ مثال کے طور پر، فرض کریں کہ ہم صرف ان چیزوں کے ناموں کو ملانا چاہتے ہیں جو لوگ پسند کرتے ہیں، لیکن صرف اس صورت میں جب وہ اس کے بارے میں پرجوش ہوں (صرف اس صورت میں جب وہ اپنے جملے کو فجائیہ کے ساتھ ختم کریں)۔ ہم کچھ ایسا کر سکتے ہیں:
پیٹرن: (\w+)(?=!) 
string: مجھے ڈیسک پسند ہے۔ میں اسٹیپلر کی تعریف کرتا ہوں۔ مجھے چراغ سے محبت ہے !
میچز:                                           ^^^^ 
گروپ:                                              1111    
( مثال کے طور پر ) آپ دیکھ سکتے ہیں کہ اوپر کیپچر گروپ (\w+)، جو عام طور پر حوالے کے کسی بھی لفظ سے میل کھاتا ہے، صرف لفظ لیمپ سے میل کھاتا ہے۔ مثبت نظر آنے کا (?=!)مطلب یہ ہے کہ ہم صرف ان ترتیبوں سے مماثل ہیں جو ختم ہوتے ہیں !لیکن ہم حقیقت میں فجائیہ کے نشان کے کردار سے میل نہیں کھاتے۔ یہ ایک اہم امتیاز ہے کیونکہ غیر کیپچر کرنے والے گروپوں کے ساتھ ہم کردار کو ملا رہے ہیں لیکن اس پر قبضہ نہیں کر رہے ہیں۔ آگے اور پیچھے دیکھنے کے ساتھ، ہم اپنے باقاعدہ اظہار کو بنانے کے لیے ایک کردار کا استعمال کرتے ہیں، لیکن پھر ہم اسے اپنے خلاف بھی نہیں بناتے۔ ہم اسے بعد میں اپنے باقاعدہ اظہار میں ملا سکتے ہیں۔ نظر آنے والی اور پیچھے دیکھنے کی چار قسمیں ہیں: مثبت نظر (؟=...)، منفی نظر (؟!...)، مثبت نظر (?<=...) اور منفی نظر (؟<! ..) . وہ وہی کرتے ہیں جیسا کہ ان کی آواز ہے - مثبت نظر آنے اور پیچھے دیکھنے سے ریگولر ایکسپریشن انجن کو مماثلت جاری رکھنے کی اجازت صرف اسی صورت میں ملتی ہے جب لکیک ہیڈ/لوک بیہائنڈ میں موجود متن حقیقت میں مماثل ہو۔ منفی lookahead اور lookbehind اس کے برعکس کرتے ہیں - وہ regex کو صرف اسی وقت مماثل ہونے دیتے ہیں جب lookahead/lookbehind میں موجود متن مماثل نہ ہو۔ مثال کے طور پر، ہم طریقہ کار کے ناموں کو صرف طریقہ کے سلسلے کی ایک زنجیر میں ملانا چاہتے ہیں، نہ کہ وہ جس چیز پر وہ کام کرتے ہیں۔ اس صورت میں، ہر طریقہ کے نام سے پہلے ایک ہونا ضروری ہے .۔ ایک سادہ نظر کا استعمال کرتے ہوئے ایک باقاعدہ اظہار یہاں مدد کر سکتا ہے:
پیٹرن: (?<=\.)(\w+) 
string: myArray. flatMap.aggregate.summarise.print !
مماثلتیں:         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:            1111111 111111111 111111111 11111    
( مثال کے طور پر ) مندرجہ بالا متن میں، ہم الفاظ کے حروف کی کسی بھی ترتیب سے میل کھاتے ہیں \w+، لیکن صرف اس صورت میں جب وہ حرف سے پہلے ہوں .۔ ہم نان کیپچرنگ گروپس کا استعمال کرتے ہوئے کچھ ایسا ہی حاصل کر سکتے ہیں، لیکن نتیجہ تھوڑا گڑبڑ ہے:
پیٹرن: (?:\.)(\w+) 
سٹرنگ: myArray .flatMap.aggregate.summarise.print !
مماثلتیں:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:            1111111 111111111 111111111 11111    
( مثال ) اگرچہ یہ چھوٹا ہے، یہ ان حروف سے میل کھاتا ہے جن کی ہمیں ضرورت نہیں ہے۔ اگرچہ یہ مثال معمولی معلوم ہو سکتی ہے، لیکن آگے اور پیچھے دیکھنے سے ہمارے باقاعدہ تاثرات کو صاف کرنے میں واقعی مدد مل سکتی ہے۔ <h3>ختم ہونے میں بہت کم رہ گئے ہیں! درج ذیل 2 کام ہمیں اس کے 1 قدم کے قریب لے جائیں گے:</h3> منفی نظر کے پیچھے (؟<!...) ریگولر ایکسپریشن انجن کو صرف اسی صورت میں مماثلت تلاش کرنے کی کوشش جاری رکھنے کی اجازت دیتا ہے جب منفی نظر کے پیچھے موجود متن نہ ہو۔ باقی متن تک ظاہر ہوتا ہے، جس کے ساتھ آپ کو ایک میچ تلاش کرنے کی ضرورت ہوتی ہے۔ مثال کے طور پر، ہم کانفرنس میں شرکت کرنے والی خواتین کے صرف آخری ناموں سے ملنے کے لیے ایک باقاعدہ اظہار استعمال کر سکتے ہیں۔ ایسا کرنے کے لیے، ہم اس بات کو یقینی بنانا چاہیں گے کہ اس شخص کے آخری نام کے آگے a Mr.. کیا آپ اس کے لیے باقاعدہ اظہار لکھ سکتے ہیں؟ (آخری نام کم از کم چار حروف لمبے تصور کیے جا سکتے ہیں۔)
پیٹرن:
string: مسٹر براؤن، محترمہ اسمتھ ، مسز جونز ، مس ڈیزی ، مسٹر۔ سبز
میچز:                ^^^^^ ^^^^^ ^^^^^ 
گروپ:                   11111 11111 11111    
( حل ) ہم کہتے ہیں کہ ہم ایک ڈیٹا بیس کو صاف کر رہے ہیں اور ہمارے پاس معلومات کا ایک کالم ہے جو فیصد کی نمائندگی کرتا ہے۔ بدقسمتی سے، کچھ لوگوں نے رینج [0.0، 1.0] میں اعداد کو اعشاریہ کی قدروں کے طور پر لکھا، جب کہ دوسروں نے رینج [0.0%، 100.0%] میں فیصد لکھا، اور پھر بھی دوسروں نے فیصد کی قدریں لکھیں۔ لیکن لفظی نشان کو بھول گئے %۔ منفی نظر کا استعمال کرتے ہوئے (؟!...)، کیا آپ صرف ان اقدار کو نشان زد کر سکتے ہیں جو فیصد ہونا چاہیے لیکن ہندسے غائب ہیں %؟ یہ قدریں 1.00 سے سختی سے زیادہ ہونی چاہئیں، لیکن بغیر کسی ٹریلنگ کے %۔ (کوئی نمبر اعشاریہ سے پہلے یا بعد میں دو ہندسوں سے زیادہ پر مشتمل نہیں ہو سکتا۔) <mark>نوٹ</mark> کہ یہ حل انتہائی مشکل ہے ۔ اگر آپ میرے جواب کو دیکھے بغیر اس مسئلے کو حل کر سکتے ہیں، تو آپ کے پاس پہلے سے ہی ریگولر ایکسپریشنز میں بڑی مہارت ہے!
پیٹرن:
سٹرنگ: 0.32 100.00 5.6 0.27 98% 12.2% 1.01 0.99% 0.99 13.13 1.10 
میچز 
:         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      111111111111111111111111    
( حل ) <h2>مرحلہ 19: ریگولر ایکسپریشنز میں حالات</h2> RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔  حصہ 4 - 5اب ہم اس مقام پر پہنچ گئے ہیں جہاں زیادہ تر لوگ ریگولر ایکسپریشنز کا استعمال نہیں کریں گے۔ ہم نے عام ریگولر ایکسپریشنز کے استعمال کے 95% کیسز کا احاطہ کیا ہے، اور 19 اور 20 مراحل میں جو کچھ بھی کیا گیا ہے وہ عام طور پر awk یا sed (یا عام مقصد کی پروگرامنگ لینگویج) جیسی مکمل خصوصیات والی ٹیکسٹ ہیرا پھیری کی زبان سے کیا جاتا ہے۔ اس نے کہا، آئیے آگے بڑھتے ہیں، تاکہ آپ کو معلوم ہو کہ باقاعدہ اظہار واقعی کیا کر سکتا ہے۔ اگرچہ ریگولر ایکسپریشن ٹورنگ مکمل نہیں ہیں ، کچھ ریگولر ایکسپریشن انجن ایسے فیچرز پیش کرتے ہیں جو مکمل پروگرامنگ لینگویج سے بہت ملتے جلتے ہیں۔ ایسی ہی ایک خصوصیت "حالت" ہے۔ Regex مشروط if-then-else بیانات کی اجازت دیتے ہیں، جہاں منتخب برانچ کا تعین یا تو "آگے دیکھو" یا "پیچھے دیکھو" سے ہوتا ہے جس کے بارے میں ہم نے پچھلے مرحلے میں سیکھا تھا۔ مثال کے طور پر، آپ تاریخوں کی فہرست میں صرف درست اندراجات کو ملانا چاہتے ہیں:
پیٹرن: (?<=Feb )([1-2][0-9])|(?<=Mar )([1-2][0-9]|3[0-1]) 
سٹرنگ: کام کرنے کی تاریخیں : 28 فروری ، 29 فروری ، 30 فروری، 30 مارچ ، 31 مارچ  
کے میچز:                   ^^ ^^ ^^ ^^ 
گروپ:                      11 11 22 22    
( مثال ) <mark>نوٹ</mark> کہ اوپر والے گروپس بھی مہینے کے حساب سے ترتیب دیئے گئے ہیں۔ ہم تمام 12 مہینوں کے لیے ایک ریگولر ایکسپریشن لکھ سکتے ہیں اور صرف درست تاریخوں پر قبضہ کر سکتے ہیں، جنہیں پھر سال کے مہینے کے حساب سے گروپس میں ملایا جائے گا۔ مندرجہ بالا ایک طرح کی if-like ڈھانچہ استعمال کرتا ہے جو صرف پہلے گروپ میں میچوں کی تلاش کرے گا اگر "Feb" کسی نمبر سے پہلے ہو (اور اسی طرح دوسرے کے لئے)۔ لیکن کیا ہوگا اگر ہم صرف فروری کے لیے خصوصی پروسیسنگ استعمال کرنا چاہتے ہیں؟ کچھ اس طرح کہ "اگر نمبر "فروری" سے پہلے ہو تو یہ کرو، ورنہ یہ اور کام کرو۔ یہاں یہ ہے کہ مشروط یہ کیسے کرتے ہیں:
پیٹرن: (?(?<=Feb )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
تار: کام کرنے کی تاریخیں: فروری 28 29 فروری ، 30 فروری، 30 مارچ، 31 مارچ  
کے میچز:                   ^^ ^^ ^^ ^^ 
گروپ:                      11 11 22 22    
( مثال کے طور پر ) if-ten-else ڈھانچہ (?(if)then|else) کی طرح لگتا ہے، جہاں (if) کو "آگے دیکھو" یا "پیچھے دیکھو" سے بدل دیا گیا ہے۔ مندرجہ بالا مثال میں، (اگر) لکھا جاتا ہے (?<=Feb). آپ دیکھ سکتے ہیں کہ ہم نے 29 سے بڑی تاریخوں کو ملایا، لیکن صرف اس صورت میں جب انہوں نے "Feb" کی پیروی نہیں کی۔ اگر آپ اس بات کو یقینی بنانا چاہتے ہیں کہ مماثلت سے پہلے کچھ متن ہو۔ مثبت نظر آنے والی شرطیں الجھن کا باعث ہو سکتی ہیں کیونکہ حالت خود کسی متن سے میل نہیں کھاتی۔ لہذا اگر آپ چاہتے ہیں کہ if کی حالت کی کبھی کوئی قدر ہو، تو اس کا موازنہ نیچے کی طرح ہونا چاہیے:
پیٹرن: (?(?=exact)exact|else)wo 
string: exact else exact دو اور  
میچز:            ^^^^^^^^^^^^^
( مثال کے طور پر ) اس کا مطلب ہے کہ مثبت نظر آنے والی شرطیں بیکار ہیں۔ آپ یہ دیکھنے کے لیے چیک کرتے ہیں کہ آیا وہ متن سامنے ہے اور پھر اس کی پیروی کرنے کے لیے مماثل نمونہ فراہم کرتے ہیں۔ مشروط اظہار یہاں ہماری مدد نہیں کرتا ہے۔ آپ مندرجہ بالا کو ایک آسان ریگولر ایکسپریشن سے بھی بدل سکتے ہیں:
پیٹرن:            (  
؟ : بالکل 
درست
( مثال ) تو، مشروط اظہار کے لیے انگوٹھے کا اصول ہے: ٹیسٹ، ٹیسٹ، اور دوبارہ ٹیسٹ۔ بصورت دیگر، جو حل آپ کے خیال میں واضح ہیں وہ انتہائی دلچسپ اور غیر متوقع طریقوں سے ناکام ہو جائیں گے :) <h3>یہاں ہم کاموں کے آخری بلاک پر آتے ہیں جو ہمیں حتمی، 20ویں مرحلے سے الگ کرتا ہے:</h3> ایک باقاعدہ اظہار لکھیں جو یہ جانچنے کے لیے کہ آیا اگلا لفظ بڑے حرف سے شروع ہوتا ہے منفی نظر آنے والی مشروط اظہار کا استعمال کرتا ہے۔ اگر ایسا ہے تو، صرف ایک بڑے حروف اور پھر چھوٹے حروف کو پکڑیں۔ اگر ایسا نہیں ہوتا ہے تو، کسی بھی لفظ کے حروف کو پکڑیں۔
پیٹرن:
string:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
میچز    
: ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 22222 22222 11111 222222 111111111 222 111    
( حل ) مشروط اظہار کے پیچھے ایک منفی نظر لکھیں جو متن کو ownsصرف اس صورت میں پکڑتا ہے جب اس سے پہلے متن نہ ہو cl، اور یہ oudsصرف اس وقت کیپچر کرتا ہے جب متن سے پہلے ہو cl۔ (ایک متضاد مثال کا تھوڑا سا، لیکن آپ کیا کر سکتے ہیں ...)
پیٹرن:
string: وہ مسخرے کچھ cl ouds کے مالک ہیں ۔ ouds
میچز:              ^^^^ ^^^^   
( حل ) <h2>مرحلہ 20: تکرار اور مزید مطالعہ</h2> RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مختصر مراحل۔  حصہ 4 - 6درحقیقت، کسی بھی موضوع کے 20 قدمی تعارف میں بہت کچھ ہے جو نچوڑا جا سکتا ہے، اور باقاعدہ اظہار بھی اس سے مستثنیٰ نہیں ہے۔ ریگولر ایکسپریشنز کے لیے بہت سے مختلف نفاذ اور معیارات ہیں جو انٹرنیٹ پر مل سکتے ہیں۔ اگر آپ مزید جاننا چاہتے ہیں، تو میرا مشورہ ہے کہ آپ حیرت انگیز سائٹ دیکھیں regularexpressions.info ، یہ ایک شاندار حوالہ ہے اور میں نے یقینی طور پر وہاں سے ریگولر ایکسپریشنز کے بارے میں بہت کچھ سیکھا ہے۔ میں آپ کی تخلیقات کو جانچنے اور شائع کرنے کے لیے اس کے ساتھ ساتھ regex101.com کی انتہائی سفارش کرتا ہوں۔ اس آخری مرحلے میں، میں آپ کو ریگولر ایکسپریشنز کے بارے میں تھوڑا اور علم دوں گا، یعنی تکراری اظہار کو کیسے لکھنا ہے۔ سادہ تکرار بہت سیدھی ہے، لیکن آئیے سوچتے ہیں کہ باقاعدہ اظہار کے تناظر میں اس کا کیا مطلب ہے۔ ریگولر ایکسپریشن میں سادہ تکرار کے لیے نحو(?R)? اس طرح لکھا جاتا ہے: ۔ لیکن، یقیناً، یہ نحو اظہار کے اندر ہی ظاہر ہونا چاہیے۔ ہم جو کریں گے وہ ہے اظہار کو اپنے اندر گھونسلا، بار کی ایک من مانی تعداد۔ مثال کے طور پر:
پیٹرن: (hey(?R)?oh) 
string:   heyoh heyyoh heyheyohoh hey oh heyhey heyheyheyohoh 
میچز     
: ^^^^^^^^^^^^^^^^^^^^^^^^^ 11111 1111111111 1111111111    
( مثال کے طور پر ) چونکہ نیسٹڈ ایکسپریشن اختیاری ہے ( (?R)پیروی کیا گیا ہے ?)، اس لیے سب سے آسان میچ یہ ہے کہ تکرار کو مکمل طور پر نظر انداز کر دیا جائے۔ تو،، heyاور پھر ohمماثلت ( heyoh)۔ اس سے زیادہ پیچیدہ اظہار کو ملانے کے لیے، ہمیں یہ تلاش کرنا چاہیے کہ مماثل ذیلی اسٹرنگ اظہار کے اس مقام پر جہاں ہم نے (?R)ترتیب داخل کی تھی، اپنے اندر اندر اندر گھسی ہوئی ہے۔ دوسرے لفظوں میں، ہم heyheyohoh یا heyheyheyohohoh، وغیرہ تلاش کرسکتے ہیں۔ ان نیسٹڈ ایکسپریشنز کے بارے میں ایک بڑی بات یہ ہے کہ، بیک حوالہ جات اور نام کیپچرنگ گروپس کے برعکس، وہ آپ کو بالکل اسی متن تک محدود نہیں کرتے جس سے آپ پہلے مماثل تھے، کردار کے لحاظ سے۔ مثال کے طور پر:
پیٹرن: ([Hh][Ee][Yy](?R)?oh) 
اسٹرنگ:   heyoh heyyoh heyHeYohoh hey oh heyhey heyHeYHEyohohoh  
مماثل ہے: ^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^ 
گروپ:    11111 1111111111 111111111111111    
( مثال کے طور پر ) آپ تصور کر سکتے ہیں کہ ریگولر ایکسپریشن انجن لفظی طور پر آپ کے ریگولر ایکسپریشن کو کئی بار خود میں کاپی اور پیسٹ کرتا ہے۔ یقینا، اس کا مطلب یہ ہے کہ بعض اوقات یہ وہ کام نہیں کر سکتا جس کی آپ نے امید کی ہو گی:
پیٹرن: ((?:\(\*)[^*)]*(?R)؟(?:\*\))) 
تار: (* تبصرہ (* نیسٹڈ *) نہیں *)
میچز:            ^^^^^^^^^^^^ 
گروپ:               111111111111    
( مثال کے طور پر ) کیا آپ بتا سکتے ہیں کہ اس ریجیکس نے صرف نیسٹڈ کمنٹ کو کیوں حاصل کیا نہ کہ بیرونی تبصرہ کو؟ ایک بات یقینی ہے: پیچیدہ ریگولر ایکسپریشنز لکھتے وقت، ہمیشہ ان کی جانچ کریں کہ وہ اس بات کو یقینی بنائیں کہ وہ آپ کے خیال کے مطابق کام کرتے ہیں۔ ریگولر ایکسپریشنز کی سڑکوں پر یہ تیز رفتار ریلی اپنے اختتام کو پہنچی۔ مجھے امید ہے کہ آپ نے اس سفر کا لطف اٹھایا۔ ٹھیک ہے، اور آخر میں، میں یہاں سے چلا جاؤں گا، جیسا کہ میں نے شروع میں وعدہ کیا تھا، مواد کے مزید گہرائی سے مطالعہ کے لیے کئی مفید لنکس:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION