JavaRush /جاوا بلاگ /Random-UR /جاوا میں باقاعدہ اظہار، حصہ 1

جاوا میں باقاعدہ اظہار، حصہ 1

گروپ میں شائع ہوا۔
ہم آپ کی توجہ میں جاوا زبان میں ریگولر ایکسپریشنز کے لیے ایک مختصر گائیڈ کا ترجمہ لاتے ہیں، جو JavaWorld ویب سائٹ کے لیے Jeff Friesen نے لکھا ہے ۔ پڑھنے میں آسانی کے لیے ہم نے مضمون کو کئی حصوں میں تقسیم کیا ہے۔ جاوا میں باقاعدہ اظہار، حصہ 1 - 1

جاوا پروگراموں میں ریگولر ایکسپریشن API کا استعمال پیٹرنز کو پہچاننے اور بیان کرنے کے لیے

جاوا کے کردار اور مختلف سٹرنگ ڈیٹا کی اقسام پیٹرن کی مماثلت کے لیے نچلی سطح کی معاونت فراہم کرتی ہیں، لیکن اس مقصد کے لیے ان کا استعمال عام طور پر کوڈ کی اہم پیچیدگی میں اضافہ کرتا ہے۔ Regex API ("Regular Expression API") کا استعمال کرکے آسان اور زیادہ پرفارمنٹ کوڈ حاصل کیا جاتا ہے۔ یہ ٹیوٹوریل آپ کو ریگولر ایکسپریشنز اور ریجیکس API کے ساتھ شروع کرنے میں مدد کرے گا۔ ہم سب سے پہلے عام طور پر پیکیج میں تین سب سے زیادہ دلچسپ کلاسوں پر تبادلہ خیال کریں گے java.util.regex، اور پھر کلاس کے اندر ایک نظر ڈالیں گے Patternاور اس کی نفیس پیٹرن سے مماثل تعمیرات کو تلاش کریں گے۔ توجہ: آپ یہاں سے اس مضمون سے ڈیمو ایپلیکیشن کا سورس کوڈ (جیف فریسن کے ذریعہ جاوا ورلڈ سائٹ کے لیے تخلیق کیا گیا) ڈاؤن لوڈ کرسکتے ہیں ۔

باقاعدہ اظہار کیا ہیں؟

ایک ریگولر ایکسپریشن (Regular expression/regex/regexp) ایک سٹرنگ ہے جو ایک ایسا پیٹرن ہے جو تاروں کے ایک مخصوص سیٹ کو بیان کرتا ہے۔ پیٹرن اس بات کا تعین کرتا ہے کہ کون سی قطار سیٹ سے تعلق رکھتی ہے۔ پیٹرن لغوی اور میٹا کریکٹرز پر مشتمل ہوتا ہے — ایسے حروف جن کے لغوی معنی کی بجائے ایک خاص معنی ہوتے ہیں۔ پیٹرن کی مماثلت مماثلتوں کو تلاش کرنے کے لیے متن کی تلاش ہے، یعنی، سٹرنگز جو ریگولر ایکسپریشن پیٹرن سے ملتی ہیں۔ جاوا اپنے Regex API کے ذریعے پیٹرن میچنگ کی حمایت کرتا ہے۔ یہ API تین کلاسوں پر مشتمل ہے: Pattern, Matcherاور PatternSyntaxException, پیکیج میں واقع java.util.regex:
  • کلاس آبجیکٹ Pattern، جسے ٹیمپلیٹس بھی کہا جاتا ہے، باقاعدہ اظہارات مرتب کیے جاتے ہیں۔
  • کلاس آبجیکٹ Matcher، یا میچرز، کریکٹر کی ترتیب میں مماثلتیں تلاش کرنے کے لیے پیٹرن کی تشریح کے طریقہ کار ہیں (وہ اشیاء جن کی کلاسیں ایک انٹرفیس کو نافذ کرتی ہیں java.lang.CharSequenceاور متن کے ذرائع کے طور پر کام کرتی ہیں)۔
  • کلاس آبجیکٹ کا PatternSyntaxExceptionاستعمال غلط ریگولر ایکسپریشن پیٹرن کو بیان کرنے کے لیے کیا جاتا ہے۔
جاوا کے مختلف طریقوں کے ذریعے پیٹرن کے ملاپ کے لیے بھی مدد فراہم کرتا ہے java.lang.String۔ مثال کے طور پر، فنکشن صرف اس صورت میں boolean matches (String regex)واپس آتا ہے trueجب کالنگ سٹرنگ ریگولر ایکسپریشن سے بالکل مماثل ہو regex۔
آسان طریقے
matches()اور کلاس کے دیگر ریگولر ایکسپریشن پر مبنی سہولت کے طریقوں کو Stringرجیکس API کی طرح ہڈ کے نیچے لاگو کیا جاتا ہے۔

ریجیکس ڈیمو

میں نے جاوا ریگولر ایکسپریشنز اور , اور RegexDemoکے مختلف طریقوں کو ظاہر کرنے کے لیے ایک ایپلیکیشن بنائی ہے ۔ ذیل میں اس ڈیمو ایپلیکیشن کا سورس کوڈ ہے۔ فہرست 1. باقاعدہ اظہار کا مظاہرہ PatternMatcherPatternSyntaxException
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java RegexDemo regex input");
         return;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      args[1] = args[1].replaceAll("\\\\n", "\n");
      try
      {
         System.out.println("regex = " + args[0]);
         System.out.println("input = " + args[1]);
         Pattern p = Pattern.compile(args[0]);
         Matcher m = p.matcher(args[1]);
         while (m.find())
            System.out.println("Found [" + m.group() + "] starting at "
                               + m.start() + " and ending at " + (m.end() - 1));
      }
      catch (PatternSyntaxException pse)
      {
         System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
         System.err.println("Описание: " + pse.getDescription());
         System.err.println("Позиция: " + pse.getIndex());
         System.err.println("Неправильный шаблон: " + pse.getPattern());
      }
   }
}
mainکلاس کا طریقہ سب سے پہلے RegexDemoاس کی کمانڈ لائن کو چیک کرتا ہے۔ اس کے لیے دو دلائل درکار ہیں: پہلا ایک ریگولر ایکسپریشن ہے، اور دوسرا ان پٹ ٹیکسٹ ہے جس میں ریگولر ایکسپریشن کو تلاش کیا جائے گا۔ آپ کو ان پٹ ٹیکسٹ کے اندر ایک نئی لائن کریکٹر استعمال کرنے کی ضرورت پڑ سکتی ہے (\n)۔ یہ صرف \کریکٹر کے بعد کریکٹر کی وضاحت کر کے کیا جا سکتا ہے n۔ فنکشن main()اس کریکٹر کی ترتیب کو یونیکوڈ ویلیو 10 میں بدل دیتا ہے۔ جاوا میں باقاعدہ اظہار، حصہ 1 - 2کوڈ کا بڑا حصہ RegexDemoمیں بند ہے try-catch۔ بلاک tryپہلے دیے گئے ریگولر ایکسپریشن اور ان پٹ ٹیکسٹ کو آؤٹ پٹ کرتا ہے، اور پھر ایک ایسی چیز بناتا ہے Patternجو مرتب شدہ ریگولر ایکسپریشن کو اسٹور کرتا ہے (پیٹرن کی مماثلت کی کارکردگی کو بہتر بنانے کے لیے ریگولر ایکسپریشن مرتب کیے جاتے ہیں)۔ ایک میچر کو آبجیکٹ سے نکالا جاتا ہے Patternاور جب تک سب مل نہیں جاتے اسے تکراری طور پر میچوں کی تلاش کے لیے استعمال کیا جاتا ہے۔ بلاک استثناء کے بارے میں مفید معلومات حاصل کرنے کے لیے catchکئی کلاس طریقوں کو کال کرتا ہے ۔ PatternSyntaxExceptionیہ معلومات ترتیب وار آؤٹ پٹ سٹریم میں آتی ہے۔ ابھی تک کوڈ کیسے کام کرتا ہے اس کی تفصیلات جاننے کی ضرورت نہیں ہے: جب ہم مضمون کے دوسرے حصے میں API کا مطالعہ کریں گے تو وہ واضح ہو جائیں گے۔ تاہم، آپ کو فہرست 1 کو مرتب کرنا ہوگا۔ فہرست 1 سے کوڈ لیں، اور پھر مرتب کرنے کے لیے کمانڈ پرامپٹ پر درج ذیل کمانڈ کو ٹائپ کریں RegexDemo: javac RegexDemo.java

پیٹرن کلاس اور اس کی تعمیرات

کلاس Pattern، تین کلاسوں میں سے پہلی کلاس جو Regex API بناتی ہے، ایک باقاعدہ اظہار کی مرتب کردہ نمائندگی ہے۔ کلاس SDK دستاویزات Patternمختلف ریگولر ایکسپریشن کنسٹرکٹس کو بیان کرتی ہیں، لیکن اگر آپ ریگولر ایکسپریشنز کو فعال طور پر استعمال نہیں کرتے ہیں، تو اس دستاویزات کے کچھ حصے الجھن کا شکار ہو سکتے ہیں۔ کوانٹیفائر کیا ہیں اور لالچی، ہچکچاہٹ اور ملکیت والے کوانٹیفائرز میں کیا فرق ہے؟ کریکٹر کلاسز، باؤنڈری میچرز، بیک ریفرنسز، اور ایمبیڈڈ فلیگ ایکسپریشنز کیا ہیں؟ میں ان اور دیگر سوالات کے جوابات درج ذیل حصوں میں دوں گا۔

لفظی تار

سب سے آسان باقاعدہ اظہار کی تعمیر ایک لفظی تار ہے۔ پیٹرن میچنگ کے کامیاب ہونے کے لیے، ان پٹ ٹیکسٹ کا کچھ حصہ اس تعمیر کے پیٹرن سے مماثل ہونا چاہیے۔ مندرجہ ذیل مثال پر غور کریں: اس مثال میں، ہم ان پٹ ٹیکسٹ میں java RegexDemo apple applet پیٹرن کے لیے مماثلت تلاش کرنے کی کوشش کر رہے ہیں ۔ مندرجہ ذیل نتیجہ ملاپ کو ظاہر کرتا ہے: appleapplet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
appleہم آؤٹ پٹ میں ریگولر ایکسپریشن اور ان پٹ ٹیکسٹ دیکھتے ہیں، اور پھر ایپلٹ میں کامیاب پتہ لگانے کا اشارہ ۔ اس کے علاوہ، اس میچ کی ابتدائی اور اختتامی پوزیشنیں دی گئی ہیں: 0اور 4، بالترتیب۔ شروع کی پوزیشن متن میں پہلی جگہ کی نشاندہی کرتی ہے جہاں میچ پایا گیا تھا، اور اختتامی پوزیشن میچ کے آخری پوائنٹ کی نشاندہی کرتی ہے۔ اب ہم کہتے ہیں کہ ہم نے درج ذیل کمانڈ لائن دی: java RegexDemo apple crabapple اس بار ہمیں مختلف ابتدائی اور اختتامی پوزیشنوں کے ساتھ درج ذیل نتیجہ ملتا ہے۔
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
بصورت دیگر، appletریگولر ایکسپریشن کے ساتھ اور بطور appleان پٹ ٹیکسٹ، کوئی مماثلت نہیں ملے گی۔ پورے ریگولر ایکسپریشن کا مماثل ہونا چاہیے، لیکن اس صورت میں، ان پٹ ٹیکسٹ کے tبعد پر مشتمل نہیں ہے apple۔ جاوا میں باقاعدہ اظہار، حصہ 1 - 3

میٹاکریکٹرز

مزید دلچسپ ریگولر ایکسپریشن میں لغوی حروف کو میٹا کریکٹرز کے ساتھ ملایا جاتا ہے۔ مثال کے طور پر، ایک ریگولر ایکسپریشن میں a.b، ڈاٹ میٹا کریکٹر کا مطلب ہے اور b کے (.)درمیان کوئی بھی حرف ۔ aدرج ذیل مثال پر غور کریں: java RegexDemo .ox "The quick brown fox jumps over the lazy ox." یہ مثال .oxریگولر ایکسپریشن اور The quick brown fox jumps over the lazy ox.ان پٹ ٹیکسٹ دونوں کے طور پر استعمال کرتی ہے۔ RegexDemoکسی بھی کردار سے شروع ہونے والے اور اس کے ساتھ ختم ہونے والے مماثلتوں کے متن کو تلاش کرتا ہے ox.اس کے نفاذ کے نتائج درج ذیل ہیں:
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
آؤٹ پٹ میں ہم دو میچ دیکھتے ہیں: foxاور ox(اس کے سامنے اسپیس کریکٹر کے ساتھ)۔ میٹا کیریکٹر پہلی صورت میں . ایک کریکٹر fاور دوسرے میں ایک اسپیس سے میل کھاتا ہے۔ .oxاگر آپ اسے میٹا کریکٹر سے بدل دیں تو کیا ہوگا .؟ یعنی، ہمیں مندرجہ ذیل کمانڈ لائن کے نتیجے میں کیا حاصل ہوتا ہے: java RegexDemo . "The quick brown fox jumps over the lazy ox." چونکہ ڈاٹ میٹا کیریکٹر کسی بھی کریکٹر سے میل کھاتا ہے، اس لیے RegexDemoان پٹ ٹیکسٹ کے تمام حروف (بشمول ٹریلنگ ڈاٹ کریکٹر) کے لیے پائے جانے والے میچوں کو آؤٹ پٹ کرے گا:
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
میٹاکریکٹرز کا حوالہ دیں۔
.ریگولر ایکسپریشن کنسٹرکٹ میں لغوی کردار کے طور پر یا کسی دوسرے میٹا کریکٹر کی وضاحت کرنے کے لیے ، آپ کو مندرجہ ذیل طریقوں میں سے کسی ایک طریقے سے اس سے بچنا چاہیے:
  • ایک بیک سلیش کردار کے ساتھ اس سے پہلے؛
  • اس میٹا کریکٹر کو \Qاور \E(مثال کے طور پر، \Q.\E) کے درمیان رکھیں۔
سٹرنگ لٹریل میں ظاہر ہونے والے کسی بھی حروف کو نقل کرنا یاد رکھیں، جیسے String regex = "\\.";بیک سلیش (مثال کے طور پر، \\.یا \\Q.\\E)۔ ان بیک سلیشس کو ڈپلیکیٹ نہ کریں جو کمانڈ لائن آرگومنٹ کا حصہ ہیں۔

کریکٹر کلاسز

بعض اوقات آپ کو ان میچوں کو محدود کرنا پڑتا ہے جن کی آپ تلاش کر رہے ہیں حروف کے مخصوص سیٹ تک۔ مثال کے طور پر، حرف کے لیے متن تلاش کریں a، e, i, oاور u, ایک حرف حرف کی ہر صورت کو ایک مماثل سمجھا جاتا ہے۔ اس طرح کے مسائل کو حل کرنے میں، ہمیں کریکٹر کلاسز سے مدد ملے گی جو مربع بریکٹ ( [ ]) کے میٹا کریکٹرز کے درمیان حروف کے سیٹ کی وضاحت کرتی ہیں۔ کلاس Patternسادہ کریکٹر کلاسز، رینج کلاسز، الٹا، یونین، انٹرسیکشن، اور گھٹاؤ کلاسز کو سپورٹ کرتی ہے۔ اب ہم ان سب کو دیکھیں گے۔

سادہ کریکٹر کلاسز

ایک سادہ کریکٹر کلاس میں ایک دوسرے کے ساتھ رکھے گئے حروف پر مشتمل ہوتا ہے اور صرف ان حروف سے میل کھاتا ہے۔ مثال کے طور پر، کلاس [abc]حروف سے مماثل ہے a، bاور c. مندرجہ ذیل مثال پر غور کریں: java RegexDemo [csw] cave جیسا کہ آپ نتائج سے دیکھ سکتے ہیں، اس مثال میں صرف وہی کردار cہے جس میں مماثلت ہے cave:
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

الٹی کریکٹر کلاسز

ایک الٹا کریکٹر کلاس میٹا کریکٹر سے شروع ہوتا ہے ^اور صرف ان حروف سے میل کھاتا ہے جو اس میں موجود نہیں ہیں۔ مثال کے طور پر، کلاس [^abc]تمام حروف سے میل کھاتی ہے سوائے a, bاور c. مندرجہ ذیل مثال پر غور کریں: java RegexDemo "[^csw]" cave نوٹ کریں کہ میرے آپریٹنگ سسٹم (ونڈوز) پر ڈبل کوٹس درکار ہیں کیونکہ شیل ان کو ^فرار کردار کے طور پر پیش کرتا ہے۔ جیسا کہ آپ دیکھ سکتے ہیں، اس مثال میں صرف حروف a، vاور پائے گئے e، جن کے لیے مماثلتیں ہیں cave:
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3

رینج کریکٹر کلاسز

رینج کریکٹر کلاس دو حروف پر مشتمل ہوتی ہے جو ایک ہائفن ( -) سے الگ ہوتے ہیں۔ تمام حروف، جو ہائفن کے بائیں طرف کے کریکٹر سے شروع ہوتے ہیں اور دائیں طرف کے کریکٹر کے ساتھ ختم ہوتے ہیں، رینج کا حصہ ہیں۔ مثال کے طور پر، رینج [a-z]تمام چھوٹے لاطینی حروف سے مماثل ہے۔ یہ ایک سادہ کلاس کی وضاحت کرنے کے مترادف ہے [abcdefghijklmnopqrstuvwxyz]۔ درج ذیل مثال پر غور کریں: java RegexDemo [a-c] clown یہ مثال صرف اس کردار سے مماثل ہوگی cجس میں مماثلت ہے clown:
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
جاوا میں ریگولر ایکسپریشنز، حصہ 2 جاوا میں ریگولر ایکسپریشنز، پارٹ 3 جاوا میں ریگولر ایکسپریشنز، پارٹ 4 جاوا میں ریگولر ایکسپریشنز، پارٹ 5
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION