JavaRush /جاوا بلاگ /Random-SD /RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء. حصو 4
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 ٽاسڪ ۾، اسان ھر ٽوڪن جي وچ ۾ ڪاما کي پڪڙيو. اسان کي انهن ڪردارن کي پڪڙڻ جي ضرورت ناهي، پر اسان کي انهن کي استعمال ڪرڻ جي ضرورت آهي اسان جي باقاعده اظهار کي ترتيب ڏيڻ لاء. اهي مثالي آپشن آهن هڪ گروپ کي استعمال ڪرڻ لاءِ بغير پڪڙڻ جي، (?:). هڪ غير پڪڙڻ وارو گروپ اهو ئي ڪري ٿو جيڪو اهو آواز جهڙو آهي - اهو ڪردارن کي گروپ ڪرڻ جي اجازت ڏئي ٿو ۽ باقاعده اظهار ۾ استعمال ڪيو وڃي ٿو، پر انهن کي هڪ عددي گروپ ۾ پڪڙي نٿو سگهي:
نمونو: (؟:")([^"]+)(؟:") 
اسٽرنگ: مان صرف "انهن حوالن اندر متن" چاهيان ٿو .
ملندڙ:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:                 1111111111111111111111111111    
( مثال ) ريگيولر ايڪسپريشن ھاڻي اقتباس ڪيل متن سان گڏو گڏ پاڻ کي اقتباس جي اکرن سان ملندو آھي، پر ڪيپچر گروپ صرف حوالو ڪيل متن کي پڪڙيو. اسان کي ائين ڇو ڪرڻ گهرجي؟ نقطو اهو آهي ته سڀ کان وڌيڪ باقاعده اظهار انجڻ توهان کي توهان جي باقاعده اظهار ۾ بيان ڪيل قبضي گروپن مان متن کي بحال ڪرڻ جي اجازت ڏين ٿا. جيڪڏهن اسان انهن اضافي ڪردارن کي ٽرم ڪري سگهون ٿا جن جي اسان کي ضرورت ناهي انهن کي اسان جي ڪيپچر گروپن ۾ شامل ڪرڻ کان سواءِ، اهو متن کي بعد ۾ پارس ڪرڻ ۽ ان کي ترتيب ڏيڻ آسان بڻائي ڇڏيندو. ھتي آھي ڪيئن صاف ڪجي CSV parser کي پوئين قدم کان:
نمونو: (؟:^|،)\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    
( حل ) HTML اوپننگ ٽيگ سان شروع ٿئي ٿو <۽ آخر ۾ >. HTML بند ڪرڻ وارا ٽيگ اکرن جي تسلسل سان شروع ٿين ٿا </۽ ڪردار سان ختم ٿين ٿا >. ٽيگ جو نالو انهن اکرن جي وچ ۾ موجود آهي. ڇا توھان ھيٺ ڏنل ٽيگ ۾ صرف نالن کي پڪڙڻ لاءِ باقاعده اظهار لکي سگھو ٿا؟ (توهان اهو مسئلو حل ڪرڻ جي قابل ٿي سگهو ٿا بغير گروپن کي استعمال ڪرڻ کان سواءِ. هي ٻه طريقا حل ڪرڻ جي ڪوشش ڪريو! هڪ ڀيرو گروپن سان ۽ هڪ ڀيرو بغير.)
نموني:
string:   <p> </span> <div> </kbd> <link> 
ميچز: ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:    1 1111 111 111 1111    
حل _ _ _ _ \N_ RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 4 - 3_ دل جي تڪليف ڏانهن وٺي وڃي ٿو، هي آخري مثال هڪ ٻيو (ڪڏهن ڪڏهن) مفيد خصوصيت ۾ هڪ سٺو سيگ آهي اڪثر باقاعده اظهار جي: پس منظر. پوئتي لنڪس گروپن کي ورجائڻ وانگر آهن جتي توهان ڪوشش ڪري سگهو ٿا ساڳئي متن کي ٻه ڀيرا پڪڙڻ جي. پر اهي هڪ اهم پاسو ۾ مختلف آهن - اهي صرف هڪ ئي متن تي قبضو ڪندا، ڪردار طرفان ڪردار. جڏهن ته هڪ ورجائيندڙ گروپ اسان کي هن طرح ڪجهه پڪڙڻ جي اجازت ڏيندو:
نمونو: (he(?:[az])+) 
اسٽرنگ:   heyabcdefg هي هي هي هي هييو هييو هييو هييو 
ملن: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ 
گروپ:    1111111111 111 1111 11111111 111111111111    
( مثال ) ... پوءِ پٺ لنڪ صرف هن سان ملندو:
نمونو: (he([az])(\2+)) 
اسٽرنگ: heyabcdefg hey heyo heyellow heyyyyyyyy 
matches:                              ^^^^^^^^^^^^ 
گروپ:                                 11233333333    
( مثال ) ڪيپچر گروپن کي ورجائڻ مفيد آهي جڏهن توهان ساڳئي نموني کي بار بار ملائڻ چاهيو ٿا، جڏهن ته پٺ لنڪس سٺيون آهن جڏهن توهان ساڳئي متن سان ملائڻ چاهيو ٿا. مثال طور، اسان هڪ پٺ لنڪ استعمال ڪري سگهون ٿا ملندڙ کولڻ ۽ بند ڪرڻ HTML ٽيگ ڳولڻ جي ڪوشش ڪرڻ لاءِ:
نموني: <(\w+)[^>]*>[^<]+<\/\1> 
اسٽرنگ:   <span style="color: red">هي</span> 
ملن: ^^^^^^^ ^^^^^^^^^^^ 
گروپ:    1111    
( مثال ) <mark>مهرباني ڪري نوٽ ڪريو</mark> ته هي هڪ انتهائي آسان مثال آهي ۽ مان زور سان صلاح ڏيان ٿو ته توهان HTML پارسر جي بنياد تي باقاعده اظهار لکڻ جي ڪوشش نه ڪريو. هي تمام پيچيده نحو آهي ۽ گهڻو ڪري توهان کي بيمار بڻائيندو. نالا پڪڙڻ وارا گروپ واپس لنڪس سان تمام ملندڙ جلندڙ آهن، تنهنڪري آئون انهن کي مختصر طور تي هتي ڍڪيندس. پٺاڻ حوالن ۽ نالي واري ڪيپچر گروپ جي وچ ۾ فرق صرف اهو آهي ته... نالي واري ڪيپچر گروپ جو نالو آهي:
نموني: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
اسٽرنگ:   <span style="color: red">Hey< </span> 
ملندڙ: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
: ^^^^^^ گروپ:    1111    
( مثال ) توهان (?<name>...) يا (?'name'...) نحو (.NET-compatible regular expression) يا هن نحو (?P<name>) استعمال ڪندي هڪ نالي وارو ڪيپچرنگ گروپ ٺاهي سگهو ٿا. ..) يا (؟P'name'...) (Python-مطابقت رکندڙ باقاعده اظهار). جيئن ته اسان PCRE (Perl Compatible Regular Expression) استعمال ڪري رهيا آهيون جيڪو ٻنهي ورزن کي سپورٽ ڪري ٿو، اسان هتي هڪ کي به استعمال ڪري سگهون ٿا. (جاوا 7 .NET نحو کي نقل ڪيو، پر صرف زاوي بریکٹ نسخو. مترجم جو نوٽ) ھڪڙي نالي واري ڪيپچرنگ گروپ کي بعد ۾ باقاعده اظهار ۾ ورجائڻ لاء، اسان استعمال ڪريون ٿا \<kname> or \k'name' (.NET) يا (؟ P = نالو) (Python). ٻيهر، PCRE انهن سڀني مختلف اختيارن کي سپورٽ ڪري ٿو. توھان وڌيڪ پڙھي سگھوٿا نالا پڪچر گروپن بابت ھتي ، پر اھو اھو آھي جيڪو توھان کي انھن بابت ڄاڻڻ جي ضرورت آھي. <h3>اسان جي مدد ڪرڻ لاءِ ڪم:</h3> مون کي ياد رکڻ ۾ مدد ڪرڻ لاءِ بيڪ لنڪس استعمال ڪريو... ummm... هن شخص جو نالو.
نموني:
تار: "هيلو منهنجو نالو جو آهي." [بعد ۾] "ان ماڻهوءَ جو نالو ڇا آهي؟ جو ؟"
ملندڙ:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ 
گروپ:                  111    
( حل ) <h2>قدم 18: اڳتي ڏسو ۽ پوئتي ڏسو</h2> RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 4 - 4ھاڻي اسان ريگولر ايڪسپريسشن جي ڪجھ جديد خصوصيتن تي غور ڪنداسين. آئون اڪثر ڪري قدم 16 تائين هر شيءِ استعمال ڪريان ٿو. پر اهي آخري چند مرحلا صرف انهن ماڻهن لاءِ آهن جيڪي استعمال ڪن ٿا ريجڪس کي تمام سنجيدگيءَ سان ملائڻ لاءِ تمام پيچيده اظهار سان. ٻين لفظن ۾، باقاعده اظهار جا ماهر. "اڳتي ڏسندڙ" ۽ "پوئتي ڏسندا" شايد ڪافي پيچيده لڳي سگھن ٿا، پر اهي حقيقت ۾ تمام پيچيده نه آهن. اهي توهان کي ڪجهه ڪرڻ جي اجازت ڏين ٿا جيڪو اسان اڳ ۾ غير گرفتاري گروپن سان ڪيو هو - چيڪ ڪريو ته ڇا واقعي متن کان پهريان يا فوري طور تي فوري طور تي متن موجود آهي جنهن سان اسان ملائڻ چاهيون ٿا. مثال طور، فرض ڪريو ته اسان صرف انهن شين جي نالن سان ملائڻ چاهيون ٿا جيڪي ماڻهو پسند ڪن ٿا، پر صرف ان صورت ۾ جڏهن اهي ان بابت پرجوش آهن (صرف ان صورت ۾ جڏهن اهي پنهنجي جملي کي عجب جي نشان سان ختم ڪن). اسان ڪجهه ڪري سگهون ٿا جهڙوڪ:
نمونو: (\w+)(؟=!) 
اسٽرنگ: مون کي ڊيسڪ پسند آهي. مان اسٽاپلر کي ساراهيان ٿو. مون کي چراغ پيار آهي !
ميچ:                                           ^^^^ 
گروپ:                                              1111    
( مثال ) توهان ڏسي سگهو ٿا ته مٿيون ڪيپچر گروپ (\w+)، جيڪو عام طور تي پاسن جي ڪنهن به لفظ سان ملندو آهي، صرف لفظ lamp سان ملندو آهي. اڳتي هلي مثبت نظر جو (?=!)مطلب اهو آهي ته اسان صرف انهن ترتيبن سان ملائي سگهون ٿا جيڪي ختم ٿين ٿا !پر اسان اصل ۾ عجب جي نشان واري ڪردار سان نه ٿا ملن. هي هڪ اهم فرق آهي ڇاڪاڻ ته غير گرفتاري گروپن سان اسان ڪردار کي ملائي رهيا آهيون پر ان کي پڪڙي نه رهيا آهيون. اڳيون ۽ پوئتي ڏسڻ سان، اسان پنهنجي باقاعده اظهار کي ٺاهڻ لاء هڪ ڪردار استعمال ڪندا آهيون، پر پوء اسان ان کي پنهنجي خلاف به نه ٿا ملن. اسان ان کي بعد ۾ اسان جي باقاعده اظهار ۾ ملائي سگهون ٿا. چار قسم جا نظر ايندڙ ۽ پوئتي نظر اچن ٿا: مثبت نظر (؟=...)، منفي ڏسندڙ (؟!...)، مثبت ڏسندڙ (؟<=...) ۽ منفي ڏسندڙ (؟<! ..) . اهي ڪندا آهن جيئن اهي آواز ڪن ٿا - مثبت نظر ۽ پوئتي ڏسڻ جي اجازت ڏين ٿا باقاعده ايڪسپريشن انجڻ کي ملائڻ جاري رکڻ جي صرف ان صورت ۾ جڏهن متن ۾ موجود متن ڏسڻ ۾ اچي ٿو. ناڪاري ڏسندڙ اڳيان ۽ پوئتي ڏسندڙ ان جي ابتڙ ڪندا آهن - اهي ريجڪس کي صرف ان صورت ۾ ملائڻ جي اجازت ڏين ٿا جڏهن لکت اڳيان/ڏسڻ جي پٺڀرائي ۾ شامل نه هجي. مثال طور، اسان طريقن جي نالن کي صرف طريقن جي سلسلي جي زنجير ۾ ملائڻ چاهيون ٿا، نه ته اهي اعتراض جيڪي اهي هلائي رهيا آهن. انهي صورت ۾، هر طريقي جو نالو اڳ ۾ هجڻ گهرجي .. هڪ باقاعده اظهار استعمال ڪندي هڪ سادي نظر واپس هتي مدد ڪري سگهي ٿي:
نمونو: (؟<=\.)(\w+) 
اسٽرنگ: myArray. flatMap.aggregate.summarise.print !
ملندڙ:         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:            1111111 111111111 111111111 11111    
( مثال ) مٿين متن ۾، اسان لفظن جي ڪنهن به ترتيب سان ملن ٿا \w+، پر صرف ان صورت ۾ جڏهن اهي حرف جي اڳيان هجن .. اسان غير گرفتاري گروپن کي استعمال ڪندي ڪجهه حاصل ڪري سگهون ٿا، پر نتيجو ٿورڙو خراب آهي:
نموني: (؟:\.)(\w+) 
اسٽرنگ: myArray .flatMap.aggregate.summarise.print !
ملندڙ:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروپ:            1111111 111111111 111111111 11111    
( مثال ) جيتوڻيڪ اھو ننڍو آھي، اھو انھن اکرن سان ملندو آھي جن جي اسان کي ضرورت ناھي. جيتوڻيڪ هي مثال معمولي لڳي سگهي ٿو، ڏسندڙ ۽ پوئتي ڏسڻ وارا حقيقت ۾ اسان جي باقاعده اظهار کي صاف ڪرڻ ۾ مدد ڪري سگھن ٿيون. <h3> ختم ٿيڻ تائين تمام ٿورا رهجي ويا آهن! هيٺيون 2 ڪم اسان کي ان جي 1 قدم وڌيڪ ويجھو آڻيندا: </ h3> منفي ڏيک جي پويان (؟<!...) ريگيولر ايڪسپريس انجڻ کي اجازت ڏئي ٿي ته هو ميچ ڳولڻ جي ڪوشش جاري رکي صرف ان صورت ۾ جڏهن متن منفي نظر جي پويان نه هجي. باقي متن تائين ڏيکاريل آهي، جنهن سان توهان کي هڪ ميچ ڳولڻ جي ضرورت آهي. مثال طور، اسان ڪانفرنس ۾ شرڪت ڪندڙ عورتن جي صرف آخري نالن سان ملائڻ لاءِ باقاعده اظهار استعمال ڪري سگهون ٿا. هن کي ڪرڻ لاءِ، اسان اهو پڪ ڪرڻ چاهيون ٿا ته ماڻهوءَ جو آخري نالو هڪ کان اڳ نه هجي Mr.. ڇا توهان ان لاءِ باقاعده اظهار لکي سگهو ٿا؟ (آخري نالا فرض ڪري سگهجن ٿا گهٽ ۾ گهٽ چار اکر ڊگھا.)
نموني:
تار: مسٽر براون، محترمه. سمٿ ، مسز. جونز ، مس ڊيزي ، مسٽر. سائو
ملندڙ:                ^^^^^ ^^^^^ ^^^^^ 
گروپ:                   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.01٪ 1.901 
^^    ^^ 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ 1111    
( حل ) <h2>Step 19: Conditions in Regular Expressions</h2> RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 4 - 5اسان ھاڻي ان نقطي تي پھتا آھيون جتي گھڻا ماڻھو ھاڻي ريگولر ايڪسپريسشن استعمال نه ڪندا. اسان غالباً 95 سيڪڙو استعمال جي ڪيسن کي ڍڪي ڇڏيو آهي سادي باقاعده اظهار لاءِ، ۽ 19 ۽ 20 مرحلن ۾ ڪيل هر شيءِ عام طور تي وڌيڪ مڪمل خصوصيت واري ٽيڪسٽ مينيپوليشن ٻولي جهڙوڪ awk يا sed (يا هڪ عام مقصدي پروگرامنگ ٻولي) ذريعي ڪئي ويندي آهي. اهو چيو ته، اچو ته اڳتي وڌو، بس توهان کي خبر آهي ته هڪ باقاعده اظهار واقعي ڇا ڪري سگهي ٿو. جيتوڻيڪ ريگيولر ايڪسپريشن ٽريننگ مڪمل نه آهن ، ڪجهه ريگيولر ايڪسپريشن انجڻ خاصيتون پيش ڪن ٿيون جيڪي مڪمل پروگرامنگ ٻولي سان ملندڙ جلندڙ آهن. اهڙي هڪ خاصيت آهي "حالت". ريجڪس شرطون if-then-else بيانن جي اجازت ڏين ٿيون، جتي چونڊيل شاخ يا ته ”اڳتي ڏس“ يا ”پوئتي ڏس“ جي ذريعي طئي ڪئي ويندي آهي جنهن بابت اسان پوئين قدم ۾ سکيو. مثال طور، توهان شايد تاريخن جي فهرست ۾ صرف صحيح درجن سان ملائڻ چاهيو ٿا:
نموني: (?<=Feb )([1-2][0-9])|(?<=Mar )([1-2][0-9]|3[0-1]) 
string: تاريخون ڪم ڪيون : فيبروري 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 کان وڏيون تاريخون گڏ ڪيون، پر صرف جيڪڏهن اهي "فيبروري" جي پيروي نه ڪن. مشروط اظهار ۾ ڏسڻ جي پٺيان استعمال ڪرڻ مفيد آهي جيڪڏهن توهان پڪ ڪرڻ چاهيو ته ميچ ڪجهه متن کان اڳ آهي. مثبت نظر ايندڙ شرطون مونجهارو ٿي سگهن ٿيون ڇاڪاڻ ته حالت پاڻ ڪنهن به متن سان نه ملندي آهي. تنهن ڪري جيڪڏهن توهان چاهيو ٿا ته if حالت ڪڏهن به هڪ قدر هجي، اهو لازمي طور تي ڏسڻ لاءِ هيٺين طرح هجڻ گهرجي:
نمونو: (؟(?=exact)exact|else)wo 
string: exact else exact two others  
matches:            ^^^^^^^^^^^^
( مثال ) هن جو مطلب آهي ته مثبت ڏسندڙ شرطون بيڪار آهن. توهان چيڪ ڪريو ته ڏسو ته اهو متن سامهون آهي ۽ پوء انهي جي پيروي ڪرڻ لاء هڪ ملندڙ نمونو مهيا ڪريو جڏهن اهو آهي. مشروط اظهار هتي اسان جي مدد نٿو ڪري. توھان پڻ مٿي کي تبديل ڪري سگھوٿا ھڪڙو آسان باقاعده اظهار سان:
نمونو: (؟:exact|else)wo 
string: exact else exact two elsewo  
matches:            ^^^^^^^^^^^^^
( مثال ) تنهن ڪري، ضابطي جي انگن اکرن لاءِ شرطي اظهار آهي: ٽيسٽ، ٽيسٽ، ۽ ٽيسٽ ٻيهر. ٻي صورت ۾، حل جيڪي توهان سمجهو ٿا ته واضح آهن سڀ کان وڌيڪ دلچسپ ۽ غير متوقع طريقن سان ناڪام ٿي ويندا :) <h3>هتي اسان ڪمن جي آخري بلاڪ تي اچون ٿا جيڪي اسان کي فائنل، 20 هين قدم کان جدا ڪري ٿو: </ h3> هڪ باقاعده اظهار لکو جيڪو استعمال ڪري ٿو منفي نظر واري مشروط اظهار کي جانچڻ لاءِ ته ڇا ايندڙ لفظ وڏي خط سان شروع ٿئي ٿو. جيڪڏهن ائين آهي، صرف هڪ وڏو اکر وٺو ۽ پوءِ ننڍا اکر. جيڪڏهن اهو نه آهي، ڪنهن به لفظ جي اکرن کي پڪڙيو.
نموني:
string:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
ميچز    
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 22222 22222 11111 222222 111111111 222 111    
( حل ) شرطي اظهار جي پويان هڪ منفي ڏيک لکو جيڪو متن کي ownsصرف ان صورت ۾ قبضو ڪري ٿو جڏهن اهو متن کان اڳ نه هجي cl، ۽ اهو متن کي oudsصرف تڏهن پڪڙي ٿو جڏهن اهو متن جي اڳيان هجي cl. (هڪ ٺهڪندڙ مثال جو ٿورو، پر توهان ڇا ڪري سگهو ٿا ...)
نموني:
تار: اهي مسخرا ڪجهه ڪل اوڊ جا مالڪ آهن . اوڊس.
ملندڙ:              ^^^^ ^^^^   
( حل ) <h2>Step 20: Recursion and Further Study</h2> RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 4 - 6حقيقت ۾، هتي تمام گهڻو آهي جيڪو ڪنهن به موضوع جي 20-قدم جي تعارف ۾ نچوض ڪري سگهجي ٿو، ۽ باقاعده اظهار جو ڪو به استثنا نه آهي. باقاعده اظهار لاءِ ڪيترائي مختلف عمل ۽ معيار آھن جيڪي انٽرنيٽ تي ملي سگھن ٿا. جيڪڏھن توھان وڌيڪ سکڻ چاھيو ٿا، منھنجي صلاح آھي توھان کي چيڪ ڪريو شاندار سائيٽ regularexpressions.info ، اھو ھڪڙو شاندار حوالو آھي ۽ مون يقيني طور تي اُتي باقاعده اظهار بابت گھڻو ڪجھ سکيو آھي. مان ان جي تمام گهڻي سفارش ڪريان ٿو، انهي سان گڏ regex101.com توهان جي تخليقن کي جانچڻ ۽ شايع ڪرڻ لاءِ. هن آخري مرحلي ۾، مان توهان کي ٿورڙي وڌيڪ ڄاڻ ڏيندس ريگيولر ايڪسپريشن جي باري ۾، يعني ريسرسي ايڪسپريشن ڪيئن لکجي. سادو ورجاءُ تمام سادو آهي، پر اچو ته غور ڪريون ته ان جو مطلب ڇا آهي باقاعده اظهار جي حوالي سان. باقاعده اظهار ۾ سادي ورجائي لاء نحو(?R)? هن طرح لکيو ويو آهي: . پر، يقيناً، هي نحو ضرور اظهار ۾ ئي ظاهر ٿئي ٿو. جيڪو اسان ڪنداسين اهو آهي اظهار کي پنهنجي اندر اندر، هڪ خودمختيار تعداد. مثال طور:
نمونو: (hey(?R)?oh) 
string:   heyoh heyyoh heyheyoho Hey heyhey Hey heyheyohoh 
ميچز     
: ^^^^^^^^^^^^^^^^^^^^^^^^ 11111 1111111111 1111111111    
( مثال ) جيئن ته nested اظهار اختياري آهي ( (?R)فالو ڪيو ?)، سادو ميچ آهي صرف ريٽرنشن کي مڪمل طور تي نظر انداز ڪرڻ. تنهن ڪري hey، ۽ پوءِ ohملندو آهي ( heyoh). ان کان وڌيڪ پيچيده ايڪسپريشن کي ملائڻ لاءِ، اسان کي اهو ڳولهڻو پوندو ته ملندڙ سب اسٽرينگ پنهنجي اندر ايڪسپريشن جي ان نقطي تي موجود آهي جتي اسان (?R)تسلسل داخل ڪيو آهي. ٻين لفظن ۾، اسان کي ڳولي سگهون ٿا heyheyohoh يا heyheyheyohohoh، وغيره. انهن nested اظهار جي باري ۾ هڪ وڏي شيء آهي ته، backreferences ۽ نامزد ڪيل گروپن جي برعڪس، اهي توهان کي صرف انهي متن تائين محدود نٿا ڪن جيڪي توهان اڳ ۾ ملن ٿا، ڪردار جي لحاظ کان. مثال طور:
نمونو: ([Hh][Ee][Yy](?R)?oh) 
اسٽرنگ:   Heyoh Heyyoh HeyHeYohoh Hey Heyhey HeyHeYheyheyheyohoh  
ملن ٿا: ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ 
گروپ:    11111 1111111111 111111111111111    
( مثال ) توھان تصور ڪري سگھو ٿا ته ريگيولر ايڪسپريس انجڻ لفظي طور تي نقل ڪري ٿو ۽ پيسٽ ڪري ٿو توھان جي ريگيولر ايڪسپريشن کي پاڻ ۾ پاڻ ۾ ڪيترائي ڀيرا. يقينا، هن جو مطلب اهو آهي ته ڪڏهن ڪڏهن اهو نه ڪري سگھي ٿو جيڪو توهان اميد ڪيو هجي:
نمونو: ((؟:\(\*)[^*)]*(؟R)؟(؟:\*\))) 
اسٽرنگ: (* تبصرو (* nested *) نه *)
ميچ:            ^^^^^^^^^^^^ 
گروپ:               111111111111    
( مثال ) ڇا توهان ٻڌائي سگهو ٿا ڇو ته هي ريجڪس صرف اندر ٿيل تبصرو تي قبضو ڪيو ۽ ٻاهرئين تبصرو نه؟ ھڪڙي شيء پڪ سان آھي: جڏھن پيچيده باقاعده اظهار لکندا، ھميشه انھن کي جانچڻ لاء پڪ ڪريو ته اھي ڪم ڪن ٿا جيئن توھان سوچيو ٿا اھي ڪندا. هي تيز رفتار ريلي باقاعدي اظهار جي روڊن رستن تان ٿيندي پڄاڻي تي پهتي. مون کي اميد آهي ته توهان هن سفر جو لطف اندوز ڪيو. خير، ۽ آخر ۾، مان هتي ڇڏيندس، جيئن مون شروع ۾ واعدو ڪيو هو، مواد جي وڌيڪ عميق مطالعي لاءِ ڪيترائي مفيد لنڪس:
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION