JavaRush /جاوا بلاگ /Random-UR /جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔ حصہ 3
articles
سطح

جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔ حصہ 3

گروپ میں شائع ہوا۔
آئیے ریگولر ایکسپریشنز کا مطالعہ جاری رکھیں۔ اس مضمون میں ہم پہلے سے طے شدہ کرداروں کی کلاسوں کے ساتھ ساتھ مقدار (سلسلوں کی تلاش) کو دیکھیں گے۔ جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 1

پہلے سے طے شدہ کریکٹر کلاسز

کلاس API Patternمیں پہلے سے طے شدہ کریکٹر کلاسز ہوتے ہیں جو عام طور پر استعمال ہونے والے ریگولر ایکسپریشنز کے لیے آسان شارٹ کٹ پیش کرتے ہیں۔ جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 2اس جدول میں، بائیں کالم میں تعمیرات دائیں کالم میں اظہارات کی شارٹ ہینڈ نمائندگی ہیں۔ مثال کے طور پر، \dایک عدد (0-9) کا مطلب ہے، \wیعنی کوئی بھی بڑے یا چھوٹے حرف، انڈر سکور یا نمبر)۔ جب بھی ممکن ہو پہلے سے طے شدہ کریکٹر کلاسز کا استعمال کریں۔ یہ آپ کے کوڈ کو پڑھنے اور غلطیوں کو ٹھیک کرنے میں آسان بنا دے گا۔ بیک سلیش سے شروع ہونے والی تعمیرات کو فرار یا محفوظ کہا جاتا ہے۔ پچھلے مضامین میں، ہم نے پہلے ہی بیک سلیش یا علامتوں کے ساتھ خصوصی حروف سے بچنے \Qاور \Eانہیں باقاعدہ حروف کے طور پر استعمال کرنے کے بارے میں بات کی ہے۔ اگر آپ باقاعدہ حروف (لفظی) کے ساتھ بیک سلیش استعمال کرتے ہیں، تو آپ کو اظہار کو مرتب کرنے کے لیے بیک سلیش سے بچنے کی ضرورت ہے۔
private final String REGEX = "\\d"; // цифра
اس مثال میں \d، ایک باقاعدہ اظہار؛ پروگرام کو مرتب کرنے کے لیے اضافی بیک سلیش ضروری ہے۔ ہمارا ٹیسٹ پروگرام براہ راست کنسول سے ریگولر ایکسپریشن پڑھتا ہے، اس لیے کسی اضافی سلیش کی ضرورت نہیں ہے۔ درج ذیل مثال پہلے سے طے شدہ کریکٹر کلاسز کے استعمال کو ظاہر کرتی ہے: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 3جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 4پہلی تین مثالوں میں، ریگولر ایکسپریشن صرف " ." (ڈاٹ اسپیشل کریکٹر) ہے، جس کا مطلب ہے کوئی بھی کریکٹر۔ لہٰذا تلاش ہر صورت کامیاب رہی۔ دیگر مثالیں پہلے سے طے شدہ کریکٹر کلاسز کا استعمال کرتی ہیں، جن کے معنی ہم نے اوپر دیے گئے جدول میں بیان کیے ہیں۔

کوانٹیفائرز

جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 4کوانٹیفائرز آپ کو سٹرنگ میں کسی کریکٹر کی موجودگی کی تعداد بتانے کی اجازت دیتے ہیں۔ آئیے ان پیچیدگیوں پر گہری نظر ڈالتے ہیں کہ لالچی، سست، اور بہت لالچی کوانٹیفائر کیسے کام کرتے ہیں۔ پہلی نظر میں ایسا لگتا ہے کہ کوانٹیفائر X؟, X?? اور X؟+ اسی طرح کام کرتے ہیں: "X ایک بار موجود ہے یا بالکل نہیں۔" ان کوانٹیفائرز کے نفاذ میں معمولی فرق ہیں، جنہیں ہم ذیل میں دیکھیں گے۔

زیرو لینتھ میچز

چلو لالچی کے ساتھ شروع کرتے ہیں. آئیے تین مختلف ریگولر ایکسپریشنز لکھتے ہیں: حرف "a" خاص حروف کے ساتھ؟، * یا +۔ آئیے دیکھتے ہیں کہ اگر ہم ان ریگولر ایکسپریشنز کو خالی لائن پر جانچتے ہیں تو کیا ہوتا ہے: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 5اوپر کی مثال میں، پہلی دو صورتوں میں تلاش کامیاب رہی، کیونکہ ایکسپریشنز a؟ اور a* کریکٹر a کو سٹرنگ سے غائب ہونے دیں۔ یہ بھی نوٹ کریں کہ شروع اور آخری میچ کا انڈیکس ایک ہی ہے (0)۔ چونکہ ان پٹ سٹرنگ کی کوئی لمبائی نہیں ہے، اس لیے پروگرام کو پہلی پوزیشن میں کچھ نہیں ملتا :)۔ اس کیس کو زیرو لینتھ میچ کہا جاتا ہے۔ اس طرح کی مماثلتیں کئی صورتوں میں ہوتی ہیں: جب ان پٹ لائن خالی ہو، ان پٹ لائن کے شروع میں، لائن کے آخری حرف کے بعد، یا لائن کے حروف کے درمیان۔ زیرو لینتھ میچز کو تلاش کرنا آسان ہے: وہ ایک ہی پوزیشن پر شروع اور ختم ہوتے ہیں۔ آئیے زیرو لینتھ میچوں کی کچھ اور مثالیں دیکھتے ہیں۔ آئیے کچھ اور مثالوں کے ساتھ صفر کی لمبائی کے میچوں کو دریافت کریں۔ آئیے ان پٹ سٹرنگ کو کریکٹر "a" میں تبدیل کریں اور ایک دلچسپ اثر کا مشاہدہ کریں: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 6تینوں کوانٹیفائرز کو کریکٹر "a" ملا، لیکن پہلے دو، جو کسی کریکٹر کی عدم موجودگی کی اجازت دیتے ہیں، پوزیشن 1 پر صفر کی لمبائی کا میچ ملا۔ - تار کے آخری کردار کے بعد۔ ایسا اس لیے ہوتا ہے کیونکہ پروگرام کردار "a" کو سٹرنگ کے طور پر دیکھتا ہے اور اس کے ذریعے "رن" کرتا ہے جب تک کہ مزید میچ نہ ہوں۔ استعمال شدہ کوانٹیفائر پر منحصر ہے، پروگرام سٹرنگ کے آخر میں "کچھ نہیں" پائے گا یا نہیں پائے گا۔ اب آئیے ان پٹ سٹرنگ کو پانچ حروف "a" کی ترتیب میں تبدیل کرتے ہیں: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 7Regular expression a؟ سٹرنگ میں ہر حرف کے لیے الگ سے ایک میچ تلاش کرتا ہے۔ اظہار a* دو مماثلتیں تلاش کرتا ہے: کریکٹر کی ترتیب "a"' اور پوزیشن 5 پر صفر کی لمبائی کا میچ۔ اور آخر میں، ریگولر ایکسپریشن a+ صرف حروف کی ترتیب تلاش کرتا ہے "a"، بغیر "کچھ نہیں" تلاش کیے :) اگر مختلف حروف پر مشتمل سٹرنگ بطور ان پٹ دی جائے تو کیا ہوگا؟ مثال کے طور پر، "ababaaaab": جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 8کردار "b" پوزیشن 1، 3، اور 8 میں ہے اور پروگرام کو ان پوزیشنوں پر صفر کی لمبائی کے میچ ملتے ہیں۔ باقاعدہ اظہار a؟ "b" پر توجہ نہیں دیتا ہے، لیکن صرف "a" کردار کی موجودگی (یا غیر موجودگی) کو تلاش کرتا ہے۔ اگر کوانٹیفائر "a" کی غیر موجودگی کی اجازت دیتا ہے، تو "a" کے علاوہ سٹرنگ کے تمام حروف کو صفر کی لمبائی کے میچ کے طور پر دکھایا جائے گا۔ دی گئی لمبائی کے سلسلے کو تلاش کرنے کے لیے، صرف گھوبگھرالی منحنی خطوط وحدانی میں لمبائی کی وضاحت کریں: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 9باقاعدہ اظہار a{3} تین "a" حروف کی ترتیب کو تلاش کرتا ہے۔ پہلی لائن میں کچھ نہیں ملا کیونکہ لائن میں کافی a's نہیں تھے۔ دوسرا 3 حروف پر مشتمل ہے، جو پروگرام تلاش کرتا ہے. تیسرے ٹیسٹ میں بھی سٹرنگ کے آغاز میں ایک میچ ملتا ہے۔ تیسرے حرف کے بعد کی ہر چیز باقاعدہ اظہار کو پورا نہیں کرتی ہے، ذیل کے کوڈ میں یہ کرتا ہے اور اس میں کئی مماثلتیں ہوں گی: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 10ترتیب کی کم از کم لمبائی بتانے کے لیے، استعمال کریں:
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
اس مثال میں، پروگرام کو صرف ایک مماثلت ملتی ہے کیونکہ سٹرنگ (3) "a" حروف کی کم از کم ترتیب کی لمبائی کی ضرورت کو پورا کرتی ہے۔ آخر میں، ترتیب کی زیادہ سے زیادہ لمبائی ترتیب دینا: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 11اس مثال میں، پہلا میچ چھٹے حرف پر ختم ہوا۔ دوسرا میچ چھٹے ایک کے بعد حروف پر مشتمل ہے، کیونکہ وہ کم از کم لمبائی کی ضرورت کو پورا کرتے ہیں۔ اگر سٹرنگ ایک حرف چھوٹا ہوتا تو دوسرا میچ نہیں ہوتا۔

کوانٹیفائر کے ساتھ کریکٹر گروپس اور کلاسز کا استعمال

اس مقام تک، ہم نے ایک ہی کردار پر مشتمل تاروں پر کوانٹیفائرز کا تجربہ کیا ہے۔ کوانٹیفائر صرف ایک حرف پر لاگو ہوتے ہیں، اس لیے ریگولر ایکسپریشن "abc+" ایک یا زیادہ بار "ab" اور "c" پر مشتمل تاروں سے مماثل ہوگا۔ اس کا مطلب ایک یا زیادہ بار "abc" نہیں ہوگا۔ لیکن کوانٹیفائر کو گروپس اور کریکٹر کلاسز کے ساتھ مل کر استعمال کیا جا سکتا ہے، جیسے [abc]+ (a یا b یا c، ایک یا زیادہ بار) یا (abc)+ ("abc" ایک یا زیادہ بار)۔ آئیے حروف کا ایک گروپ (کتا) تلاش کریں، ایک لائن میں تین بار: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔  حصہ 3 - 12پہلی مثال میں، پروگرام ایک میچ تلاش کرتا ہے، کیونکہ کوانٹیفائر حروف کے ایک گروپ تک پھیلا ہوا ہے۔ اگر آپ بریکٹ کو ہٹاتے ہیں تو، کوانٹیفائر {3} صرف حرف "g" پر لاگو ہوگا۔ آپ کریکٹر کلاسز کے ساتھ کوانٹیفائر بھی استعمال کر سکتے ہیں: Основы регулярных выражений в Java. Часть 3 - 13{3} کوانٹیفائر پہلی مثال میں بریکٹ میں کریکٹر کلاس پر لاگو ہوتا ہے، اور دوسری میں - صرف کریکٹر "c" پر۔

لالچی، سست اور ضرورت سے زیادہ لالچی کوانٹیفائر کے درمیان فرق

لالچی، ہچکچاہٹ، اور ملکیتی مقدار کے درمیان معمولی فرق ہیں۔ لالچی کوانٹیفائرز کا نام اس لیے رکھا گیا ہے کیونکہ وہ سب سے طویل ممکنہ میچ تلاش کرنے کی کوشش کرتے ہیں: پروگرام پہلے پوری تار کو "کھانے" کی کوشش کرتا ہے، اگر کوئی میچ نہیں ملتا ہے، تو ایک حرف کو ضائع کر دیا جاتا ہے اور تلاش کو دہرایا جاتا ہے جب تک کہ کوئی میچ نہ مل جائے یا مزید کوئی کردار باقی نہیں رہے۔ دوسری طرف، سست لوگ، لائن کے آغاز سے شروع کرتے ہیں، کردار کے بعد کردار شامل کرتے ہیں جب تک کہ وہ ایک میچ تلاش نہ کریں. آخر میں، غیرت مند کوانٹیفیکیشن لالچی کی طرح حروف کو ہٹائے بغیر، پورے سٹرنگ کو ایک بار اسکین کرتا ہے۔ مظاہرے کے لیے، ہم xfooxxxxxxxfoo سٹرنگ استعمال کریں گے۔ Основы регулярных выражений в Java. Часть 3 - 14پہلی مثال لالچی .* کوانٹیفائر کا استعمال کرتی ہے کسی بھی حرف کو تلاش کرنے کے لیے، 0 یا اس سے زیادہ بار، اس کے بعد حروف "f" "o" "o"۔ چونکہ کینٹیفائر لالچی ہے، اس لیے ملا میچ پوری تار پر مشتمل ہے۔ ایک لالچی کوانٹیفائر تمام میچز کو سٹرنگ میں نہیں پائے گا کیونکہ پہلے مرحلے میں، پوری سٹرنگ کو اسکین کرنے کے بعد، یہ ایک میچ تلاش کرے گا اور کام ختم کر دے گا۔ دوسری مثال سست ہے اور لائن کے آغاز سے شروع ہوتی ہے، حرف بہ حرف شامل کرتے ہوئے۔ پروگرام "خالی پن" کی جانچ کر کے شروع ہوتا ہے، لیکن اس کے بعد سے ترتیب "foo" لائن کے شروع میں نہیں ہے، تلاش "x" حرف کے اضافے کے ساتھ جاری رہتی ہے، جس کے بعد پہلا میچ انڈیکس 0 اور 4 کے درمیان پایا جائے گا۔ تلاش لائن کے اختتام تک جاری رہتی ہے۔ اور دوسرا میچ انڈیکس 4 اور 13 کے درمیان پایا جائے گا۔ تیسری مثال میں اتفاق نہیں ملتا کیونکہ کوانٹیفائر حسد کرتا ہے۔ اس صورت میں، ریگولر ایکسپریشن .*+ نے پوری لائن کو "کھایا"، "foo" کے لیے کچھ نہیں چھوڑا۔ جب آپ کو کسی تار میں غیر ضروری چیز کو ضائع کرنے کی ضرورت ہو تو غیرت مند کوانٹیفائر کا استعمال کریں، یہ مساوی لالچی کوانٹیفائر سے زیادہ موثر ہوگا۔ بس! ماخذ سے لنک: جاوا میں باقاعدہ اظہار کی بنیادی باتیں۔ حصہ 3
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION