JavaRush /جاوا بلاگ /Random-UR /RegEx: ریگولر ایکسپریشنز میں مہارت حاصل کرنے کے لیے 20 مخ...
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 fo Bar r a23 mm ab x
میچز: ^^^ ^^^ ^^^ ^^^  
( مثال ) نوٹکہ جب ایک شناخت کنندہ درست ہے لیکن 3 حروف سے زیادہ طویل ہے، تو صرف پہلے تین حروف مماثل ہوتے ہیں۔ اور جب شناخت کنندہ درست ہے، لیکن 3 سے کم حروف پر مشتمل ہے، تو regex اسے بالکل نہیں ملتا! مسئلہ یہ ہے کہ بریکٹ والے تاثرات []بالکل ایک حرف سے ملتے ہیں، جیسا کہ کریکٹر کلاسز جیسے \w. اس کا مطلب یہ ہے کہ مندرجہ بالا ریگولر ایکسپریشن میں کوئی بھی میچ بالکل تین حروف کا ہونا چاہیے۔ تو یہ اس طرح کام نہیں کرتا جیسا کہ ہم نے امید کی تھی۔ *خصوصی کردار اور یہاں مدد کر سکتے ہیں +۔ یہ ایسے موڈیفائرز ہیں جنہیں کسی بھی اظہار کے دائیں جانب شامل کیا جا سکتا ہے تاکہ اس اظہار کو ایک سے زیادہ مرتبہ مل سکے۔ کلین سٹار (یا "نجمہ") *اس بات کی نشاندہی کرے گا کہ پچھلے ٹوکن کو صفر اوقات سمیت کسی بھی تعداد میں ملایا جانا چاہیے۔ جمع کا نشان +اس بات کی نشاندہی کرے گا کہ آپ کو ایک یا زیادہ بار تلاش کرنے کی ضرورت ہے۔ اس طرح، اس سے پہلے ہونے والا اظہار +لازمی ہے (کم از کم ایک بار)، جبکہ اس سے پہلے آنے والا اظہار *اختیاری ہے، لیکن جب یہ ظاہر ہوتا ہے، تو یہ کئی بار ظاہر ہو سکتا ہے۔ اب، اس علم کے ساتھ، ہم مندرجہ بالا باقاعدہ اظہار کو درست کر سکتے ہیں:
پیٹرن: [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:GBTB
پیٹرن:
سٹرنگ:   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+ 
string:   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:   ظاہر ہے ، ایک کتا بلی سے بہتر پالتو جانور ہے ۔
مماثلتیں: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( مثال کے طور پر ) ... لیکن یہ کلاس "لفظ" کے تمام ٹرپل حروف کی ترتیب سے میل کھاتا ہے۔ لیکن "کتے" اور "بلی" میں حروف بھی مشترک نہیں ہیں، لہذا مربع بریکٹ یہاں ہماری مدد نہیں کریں گے۔ یہاں سب سے آسان باقاعدہ اظہار ہے جو ہم استعمال کر سکتے ہیں جو دونوں اور صرف ان دو الفاظ سے میل کھاتا ہے:
پیٹرن: dog|cat 
string: ظاہر ہے، ایک کتا بلی سے بہتر پالتو جانور ہے ۔
میچز:               ^^^ ^^^ 
( مثال کے طور پر ) ریگولر ایکسپریشن انجن پہلے کریکٹر کے بائیں طرف پوری ترتیب کو ملانے کی کوشش کرتا ہے |، لیکن اگر یہ ناکام ہو جاتا ہے، تو یہ کریکٹر کے دائیں طرف کی ترتیب کو ملانے کی کوشش کرتا ہے |۔ ایک سے زیادہ حروف کو |دو سے زیادہ متبادل ترتیب سے ملنے کے لیے بھی جکڑا جا سکتا ہے:
پیٹرن: dog|cat|pet 
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