JavaRush /جاوا بلاگ /Random-SD /RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء. حصو 2
Artur
سطح
Tallinn

RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء. حصو 2

گروپ ۾ شايع ٿيل
RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء. حصو 1 اصل هتي آخري حصي ۾ اسان آسان ترين ريگيولر ايڪسپريشنز ۾ مهارت حاصل ڪئي، ۽ اڳ ۾ ئي ڪجهه سکي چڪا آهيون. هن حصي ۾ اسان ٿورو وڌيڪ پيچيده ڊيزائن جو مطالعو ڪنداسين، پر مون تي يقين رکو، اهو ايترو ڏکيو نه هوندو جيترو اهو لڳي سگهي ٿو. RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 2 - 1پوء اچو ته جاري رکون!

قدم 8: اسٽار *۽ پلس سائن+

RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 2 - 2هينئر تائين، اسان گهٽ ۾ گهٽ صرف هڪ ڏنل ڊيگهه جي تارن کي ملائڻ جي قابل ٿي چڪا آهيون. پر تازو مسئلن ۾ اسان ان حد تائين پهچي چڪا آهيون جيڪو اسان ان نوٽشن سان ڪري سگهون ٿا جيڪو اسان هينئر تائين ڏٺو آهي. اچو ته فرض ڪريون، مثال طور، ته اسان صرف 3-ڪردار جاوا سڃاڻپ ڪندڙ تائين محدود نه آهيون، پر اهو ته اسان وٽ ڪنهن به ڊيگهه جا سڃاڻپ ڪندڙ هوندا. ھڪڙو حل جيڪو پوئين مثال ۾ ڪم ڪري سگھي ٿو ھيٺئين مثال ۾ ڪم نه ڪندو.
نمونو: [a-zA-Z_$]\w\w 
string:   __e $12 3 3.2 for Bar r a23 mm ab x
ملندڙ: ^^^ ^^^ ^^^ ^^^  
( مثال ) نوٽجڏهن هڪ سڃاڻپ ڪندڙ صحيح آهي پر 3 اکرن کان ڊگھو آهي، صرف پهرين ٽي اکر ملندا آهن. ۽ جڏھن سڃاڻپ ڪندڙ صحيح آھي، پر 3 اکرن کان گھٽ ھجي، ته پوءِ ريجڪس ان کي بلڪل نه ڳولھيو! مسئلو اهو آهي ته بریکٹ ٿيل اظهار []بلڪل هڪ ڪردار سان ملن ٿا، جيئن ته ڪردار طبقن جهڙوڪ \w. هن جو مطلب آهي ته مٿي ڏنل باقاعده اظهار ۾ ڪنهن به ميچ کي بلڪل ٽي اکر ڊگهو هجڻ گهرجي. تنهنڪري اهو ڪم نٿو ڪري سگهي جيئن اسان اميد ڪئي هئي. *خاص ڪردار ۽ هتي مدد ڪري سگھن ٿا +. اهي تبديليون آهن جيڪي ڪنهن به اظهار جي ساڄي پاسي شامل ڪري سگهجن ٿيون انهي اظهار کي هڪ ڀيرو کان وڌيڪ ملائڻ لاء. Kleene Star (يا "Asterisk") *ظاهر ڪندو ته پوئين ٽوڪن کي ڪنهن به وقت سان ملائڻ گهرجي، بشمول صفر ڀيرا. پلس نشاني +ظاهر ڪندو ته توهان کي هڪ يا وڌيڪ ڀيرا ڳولڻ جي ضرورت آهي. اهڙيء طرح، اظهار جيڪو اڳ ۾ هوندو +آهي لازمي آهي (گهٽ ۾ گهٽ هڪ ڀيرو)، جڏهن ته اظهار جيڪو اڳي آهي *اختياري آهي، پر جڏهن اهو ظاهر ٿئي ٿو، اهو هر وقت ظاهر ٿي سگهي ٿو. هاڻي، هن علم سان، اسان مٿي ڏنل باقاعده اظهار کي درست ڪري سگهون ٿا:
نمونو: [a-zA-Z_$]\w* 
string:   __e $123 3.2 for Barr a23mm ab x 
ميچز: ^^^ ^^^^ ^^^^ ^^^^ ^^^^ 
( مثال ) هاڻي اسان ڪنهن به ڊگھي جي صحيح سڃاڻپ ڪندڙ سان ملون ٿا! بنگو! پر ڇا ٿيندو جيڪڏهن اسان ان +جي بدران استعمال ڪيو *؟
نمونو: [a-zA-Z_$]\w+ 
string:   __e $123 3.2 for Barr a23mm ab x
ملندڙ: ^^^ ^^^^ ^^^^ ^^^^ ^^^^ 
( مثال ) اسان آخري ميچ کي مس ڪيو، х. اهو ئي سبب آهي ته ان کي +گهٽ ۾ گهٽ هڪ اکر ملائڻ جي ضرورت آهي، پر جيئن ته قوس ۾ ٺهيل اظهار []اڳ \w+۾ ئي ڪردار کي 'کائي ڇڏيو آهي' x، اتي وڌيڪ اکر موجود نه آهن، تنهنڪري ميچ ناڪام ٿي. جڏهن اسان استعمال ڪري سگهون ٿا +؟ جڏهن اسان کي گهٽ ۾ گهٽ هڪ ميچ ڳولڻ جي ضرورت آهي، پر اهو مسئلو ناهي ته ڪيترا ڀيرا ڏنل اظهار کي ملائڻ گهرجي. مثال طور، جيڪڏهن اسان ڪنهن به انگن کي ڳولڻ چاهيون ٿا جنهن ۾ ڊيسيمل پوائنٽ شامل آهن:
نموني: \d*\.\d+ 
اسٽرنگ:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 
ملن: ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^  
( مثال ) نوٽته عددن کي اختياري نقطي جي کاٻي پاسي ٺاهڻ سان، اسان 0.011 ۽ .2 ٻنهي کي ڳولڻ جي قابل هئاسين. هن کي ڪرڻ لاءِ، اسان کي لازمي طور تي هڪ ڊيسيمل پوائنٽ سان ملائڻو پوندو \.۽ گهٽ ۾ گهٽ هڪ عدد ڊيسيمل پوائنٽ جي ساڄي پاسي سان \d+. مٿيون ريگيولر ايڪسپريشن ڪنهن انگ سان نه ملندو 3.، جيئن اسان کي ملائڻ لاءِ ڊيسيمل پوائنٽ جي ساڄي پاسي گهٽ ۾ گهٽ هڪ عدد گهرجي.

معمول وانگر، اچو ته ڪجھ سادو مسئلا حل ڪريون:

ھيٺ ڏنل اقتباس ۾ سڀ انگريزي لفظ ڳولھيو.
نموني:
تار: 3 جمع 3 ڇهه آهي پر 4 جمع ٽي آهي 7
ملندڙ:    ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ 
( حل ) ھيٺ ڏنل فهرست ۾ سڀ فائل سائيز علامتون ڳولھيو. فائل جي سائيز ھڪڙي عدد تي مشتمل ھوندي (جنهن سان يا بغير ڊيسيمل پوائنٽ سان) بعد ۾ KB, MB, GBor TB:
نموني:
تار:   11TB 13 14.4MB 22HB 9.9GB TB 0KB 
ميچز: ^^^^ ^^^^^^^^^^^^^^  
( حل )

قدم 9: "اختياري" سوال نشان?

RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 2 - 3ڇا توهان اڳ ۾ ئي لکيو آهي regex آخري مسئلو حل ڪرڻ لاء؟ ڇا اهو ڪم ڪيو؟ هاڻي ان کي هتي لاڳو ڪرڻ جي ڪوشش ڪريو:
نموني:
تار: 1..3KB 5...GB ..6TB
ملن:  
ظاھر آھي، انھن مان ڪو به ٺھيل صحيح فائل سائيز نه آھي، تنھنڪري ھڪڙو سٺو باقاعده اظهار انھن مان ڪنھن ھڪ سان نه ملڻ گھرجي. آخري مسئلي کي حل ڪرڻ لاءِ جيڪو حل مون لکيو آهي اهو انهن سڀني سان ملندو آهي، گهٽ ۾ گهٽ جزوي طور:
نمونو: \d+\.*\d*[KMGT]B 
اسٽرنگ:   1..3KB  5...GB .. 6TB 
ميچز: ^^^^^^^^^^^^^^^ 
( مثال ) پوءِ مسئلو ڇا آهي؟ حقيقت ۾، اسان کي صرف هڪ ڊيسيمل پوائنٽ ڳولڻ جي ضرورت آهي، جيڪڏهن هڪ آهي. پر *اها اجازت ڏئي ٿي ڪنهن به نمبر جي ميچن، بشمول صفر. ڇا ھڪڙو طريقو آھي جيڪو صرف صفر ڀيرا يا ھڪڙي وقت سان ملندو؟ پر هڪ دفعو کان وڌيڪ نه؟ يقيناً آهي. "اختياري" ?ھڪڙو تبديل ڪندڙ آھي جيڪو صفر يا اڳئين اکرن مان ھڪڙي سان ملندو آھي، پر وڌيڪ نه:
نمونو: \d+\.؟\d*[KMGT]B 
اسٽرنگ: 1.. 3KB 5...GB .. 6TB 
ميچ:     ^^^ ^^^ 
( مثال ) اسان هتي هڪ حل جي ويجهو آهيون، پر اهو بلڪل ناهي جيڪو اسان کي گهرجي. اسان ڏسنداسين ته هن کي ڪيئن درست ڪجي ٿورن قدمن ۾ ٿوري دير بعد.

ساڳئي وقت ۾، اچو ته هن مسئلي کي حل ڪريون:

ڪجھ پروگرامنگ ٻولين ۾ (مثال طور جاوا)، ڪجھ انٽيجر ۽ فلوٽنگ پوائنٽ (ڊٽ) انگن جي پٺيان ھجن l/ L۽ f/ Fکي اشارو ڪرڻ لاءِ ته انھن کي ڊگھو/ فلوٽ (ترتيب سان) سمجھيو وڃي بلڪ باقاعده انٽ/ڊبل وانگر. ھيٺ ڏنل لڪير ۾ سڀ صحيح "ڊگها" نمبر ڳولھيو:
نموني:
تار:   13L ڊگهو 2l 19 L lL 0 
ملندڙ: ^^^ ^^ ^^ ^ 
( حل )

قدم 10: "يا" نشاني|

RegEx: 20 مختصر قدم باقاعده اظهار جي ماهر ڪرڻ لاء.  حصو 2 - 4قدم 8 ۾، اسان کي مختلف قسم جي سچل پوائنٽ نمبرن کي ڳولڻ ۾ ڪجهه مشڪل هئي:
نموني: \d*\.\d+ 
اسٽرنگ:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 
ملن: ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^  
مٿيون نمونو انگن اکرن سان ملندو آهي ڊيسيمل پوائنٽ سان ۽ گهٽ ۾ گهٽ هڪ عدد ڊيسيمل پوائنٽ جي ساڄي پاسي. پر ڇا جيڪڏهن اسان پڻ اسٽرنگ سان ملائڻ چاهيون ٿا جهڙوڪ 0.؟ (ڊسيمل پوائنٽ جي ساڄي پاسي ڪو به انگ نه آهي.) اسان هن طرح هڪ باقاعده اظهار لکي سگهون ٿا:
نموني: \d*\.\d* 
اسٽرنگ:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 
ملندڙ: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( مثال ) هي ملندو آهي 0.، پر اهو پڻ هڪ نقطي سان ملندو آهي .، جيئن توهان مٿي ڏسي سگهو ٿا. اصل ۾ اسان جيڪو ملائڻ جي ڪوشش ڪري رهيا آهيون اهي ٻه مختلف اسٽرنگ ڪلاس آهن:
  1. انگن اکرن سان گهٽ ۾ گهٽ هڪ عدد ڊيسيمل پوائنٽ جي ساڄي پاسي
  2. انگن اکرن سان گهٽ ۾ گهٽ هڪ عدد ڊيسيمل پوائنٽ جي کاٻي پاسي
اچو ته هيٺيون 2 باقاعده اظهار لکون، هڪ ٻئي کان آزاد:
نموني: \d*\.\d+ 
اسٽرنگ:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
ملندڙ: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
نموني: \d+\.\d* 
اسٽرنگ:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0 .
ملندڙ: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
اسان ڏسون ٿا ته انهن مان ڪنهن به صورت ۾ سب اسٽرنگ 42، يا انجڻ سان نه مليا آهن 5. گهربل نتيجو حاصل ڪرڻ لاء، اسان کي انهن باقاعده اظهار کي گڏ ڪرڻ لاء نقصان نه ٿيندو. اسان اهو ڪيئن حاصل ڪري سگهون ٿا؟ "يا" نشاني اسان کي اجازت ڏئي ٿي ته هڪ باقاعده اظهار ۾ هڪ ئي وقت ۾ ميچن جي ڪيترن ئي ممڪن ترتيبن کي بيان ڪري سگهون. جيئن ته "يا" نشاني اسان کي متبادل واحد اکرن کي بيان ڪرڻ جي اجازت ڏئي ٿي، اسان متبادل گھڻ-ڪردار اظهار جي وضاحت ڪري سگھون ٿا. مثال طور، جيڪڏهن اسان "ڪتو" يا "ٻلي" ڳولڻ چاهيون ٿا، اسان ڪجهه هن طرح لکي سگهون ٿا: 6.|[]|
نموني: \w\w\w 
string:   ظاهر آهي ، هڪ ڪتو ٻلي کان بهتر پالتو آهي .
ملندڙ: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( مثال ) ... پر هي ڪلاس "لفظ" جي سڀني ٽنهي حرفن جي ترتيب سان ملندو آهي. پر ”ڪتو“ ۽ ”ٻلي“ ۾ اکر به عام نه آهن، تنهنڪري چورس بریکٹ هتي اسان جي مدد نه ڪندا. ھتي آھي آسان ترين باقاعدي اظهار جيڪو اسان استعمال ڪري سگھون ٿا جيڪو ٻنھي ۽ صرف انھن ٻن لفظن سان ملندو آھي.
نمونو: ڪتو | ٻلي 
جو تار: ظاهر آهي، هڪ ڪتو ٻلي کان بهتر پالتو آهي .
ملندڙ:               ^^^ ^^^ 
( مثال ) ريگيولر ايڪسپريس انجڻ پهريون ڀيرو سڄي ترتيب کي اکر جي کاٻي پاسي سان ملائڻ جي ڪوشش ڪري ٿو |، پر جيڪڏهن اهو ناڪام ٿئي ٿو، ته پوءِ ان ترتيب کي اکر جي ساڄي پاسي ملائڻ جي ڪوشش ڪري ٿو |. گھڻن اکرن کي |پڻ زنجير ڪري سگھجي ٿو ٻن کان وڌيڪ متبادل ترتيبن سان ملائڻ لاءِ:
نمونو : ڪتو _ _ _ _ _ _
ملندڙ:               ^^^ ^^^ ^^^ 
( مثال )

هاڻي اچو ته هن قدم کي بهتر سمجهڻ لاءِ ٻيا ٻه مسئلا حل ڪريون:

مٿي ڏنل اعشاريه ريگولر ايڪسپريشن کي درست ڪرڻ لاءِ نشاني استعمال ڪريو |جيئن نتيجو پيدا ڪرڻ لاءِ:
نموني:
تار:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0 .
ملندڙ: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( حل ) استعمال ڪريو نشاني |، ڪردار طبقن، "اختياري" ?، وغيره هڪ واحد ريگيولر ايڪسپريشن ٺاهڻ لاءِ جيڪو ٻنهي انٽيجر ۽ فلوٽنگ پوائنٽ (ڊٽ) انگن سان ملندو، جيئن اڳئين قدم جي آخر ۾ مسئلي ۾ بحث ڪيو ويو آهي (اهو مسئلو ٿورو وڌيڪ پيچيده، ها ؛))
نموني:
تار:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
ملائيندڙ: ^^^ ^^^^^^^^^^^^^^^^^^^^^^^  
( حل ) 20 مختصر مرحلا باقاعده اظهار جي مهارت حاصل ڪرڻ لاء. حصو 3 RegEx: 20 مختصر مرحلا باقاعده اظهار جي مهارت حاصل ڪرڻ لاءِ. حصو 4
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION