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

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

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

گرفتار گروپوں کے ساتھ کام کرنے کے طریقے

ایپلیکیشن سورس کوڈ RegexDemoمیں میتھڈ کال شامل ہے m.group()۔ یہ طریقہ group()کلاس کے کئی طریقوں میں سے ایک ہے Matcherجس کا مقصد پکڑے گئے گروپوں کے ساتھ کام کرنا ہے:
  • طریقہ int groupCount()حل کرنے والے پیٹرن میں پکڑے گئے گروپوں کی تعداد لوٹاتا ہے۔ یہ نمبر خصوصی کیپچر گروپ نمبر 0 کو مدنظر نہیں رکھتا، جو کہ مجموعی طور پر پیٹرن سے مطابقت رکھتا ہے۔

  • یہ طریقہ String group()پچھلے میچ کے حروف کو واپس کرتا ہے۔ خالی سٹرنگ کی کامیاب تلاش کی اطلاع دینے کے لیے، یہ طریقہ ایک خالی سٹرنگ لوٹاتا ہے۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش کا آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

  • یہ طریقہ String group(int group)پچھلے طریقہ سے ملتا جلتا ہے، سوائے اس کے کہ یہ پیرامیٹر کے ذریعے متعین گروپ نمبر کے ذریعے حاصل کیے گئے پچھلے میچ کے حروف واپس کرتا ہے group۔ نوٹ کریں کہ یہ اس group(0)کے برابر ہے group()۔ اگر ٹیمپلیٹ میں دیے گئے نمبر کے ساتھ کیپچر گروپ نہیں ہے، تو طریقہ ایک استثناء دیتا ہے IndexOutOfBoundsException۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

  • یہ طریقہ String group(String name)نام گروپ کے ذریعے حاصل کیے گئے پچھلے میچ کے حروف کو واپس کرتا ہے۔ اگر کیپچر کردہ گروپ کا نام ٹیمپلیٹ میں نہیں ہے تو، ایک استثناء دیا جاتا ہے IllegalArgumentException۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش کا آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

groupCount()مندرجہ ذیل مثال اور طریقوں کے استعمال کو ظاہر کرتی ہے group(int group):
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
عملدرآمد کے نتائج:
3
0: abc
1: abc
2: bc
3: c
جاوا میں باقاعدہ اظہار، حصہ 4 - 2

میچ پوزیشنز کا تعین کرنے کے طریقے

کلاس Matcherکئی طریقے فراہم کرتی ہے جو میچ کی ابتدائی اور اختتامی پوزیشنوں کو واپس کرتی ہے:
  • یہ طریقہ int start()پچھلے میچ کی ابتدائی پوزیشن لوٹاتا ہے۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

  • یہ طریقہ int start(int group)پچھلے طریقہ سے ملتا جلتا ہے، لیکن اس گروپ کے لیے پائے جانے والے پچھلے میچ کی ابتدائی پوزیشن لوٹاتا ہے جس کا نمبر پیرامیٹر کے ذریعے متعین کیا گیا ہے group۔ اگر ٹیمپلیٹ میں دیے گئے نمبر کے ساتھ کیپچر گروپ نہیں ہے، تو طریقہ ایک استثناء دیتا ہے IndexOutOfBoundsException۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

  • یہ طریقہ int start(String name)پچھلے طریقہ سے ملتا جلتا ہے، لیکن گروپ کے لیے پائے جانے والے پچھلے میچ کی ابتدائی پوزیشن لوٹاتا ہے name۔ اگر کیپچر گروپ nameٹیمپلیٹ میں نہیں ہے تو، ایک استثناء پھینک دیا جاتا ہے IllegalArgumentException۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش کا آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

  • یہ طریقہ int end()پچھلے میچ کے آخری کریکٹر کی پوزیشن پلس 1 لوٹاتا ہے۔ اگر میچر نے ابھی تک میچ نہیں کیا ہے یا پچھلا سرچ آپریشن ناکام ہو گیا ہے، تو ایک استثناء دیا جاتا ہے IllegalStateException۔

  • یہ طریقہ int end(int group)پچھلے طریقہ سے ملتا جلتا ہے، لیکن اس گروپ کے لیے پائے جانے والے پچھلے میچ کی آخری پوزیشن لوٹاتا ہے جس کا نمبر پیرامیٹر کے ذریعے بیان کیا گیا ہے group۔ اگر ٹیمپلیٹ میں دیے گئے نمبر کے ساتھ کیپچر گروپ نہیں ہے، تو طریقہ ایک استثناء دیتا ہے IndexOutOfBoundsException۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش کا آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

  • یہ طریقہ int end(String name)پچھلے طریقہ سے ملتا جلتا ہے، لیکن گروپ کے لیے پائے جانے والے پچھلے میچ کی آخری پوزیشن لوٹاتا ہے name۔ اگر کیپچر گروپ nameٹیمپلیٹ میں نہیں ہے تو، ایک استثناء پھینک دیا جاتا ہے IllegalArgumentException۔ اگر حل کرنے والے نے ابھی تک تلاش نہیں کی ہے یا پچھلا تلاش کا آپریشن ناکام ہو گیا ہے تو، ایک استثناء دیا جاتا ہے IllegalStateException۔

درج ذیل مثال دو میچ لوکیشن طریقوں کو ظاہر کرتی ہے جو کیپچر گروپ نمبر 2 کے لیے ابتدائی/اختتام میچ پوزیشنز کو آؤٹ پٹ کرتی ہے:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
   System.out.println("Найдено " + m.group(2));
   System.out.println("  начинается с позиции " + m.start(2) +
                      " и заканчивается на позиции " + (m.end(2) - 1));
   System.out.println();
}
اس مثال کی پیداوار مندرجہ ذیل ہے:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

PatternSyntaxException کلاس کے طریقے

کلاس کی ایک مثال PatternSyntaxExceptionریگولر ایکسپریشن میں نحوی غلطی کو بیان کرتی ہے۔ طریقوں compile()اور matches()کلاس سے اس طرح کی ایک استثناء پھینکتا ہے Pattern، اور مندرجہ ذیل کنسٹرکٹر کے ذریعے تشکیل دیا جاتا ہے: PatternSyntaxException(String desc, String regex, int index) یہ کنسٹرکٹر مخصوص وضاحت ( desc) ) ریگولر ایکسپریشن ( regex) اور اس پوزیشن کو محفوظ کرتا ہے جس پر نحو کی خرابی واقع ہوئی ہے۔ اگر نحوی غلطی کا مقام معلوم نہیں ہے، تو قدر کو indexسیٹ کیا جاتا ہے -1۔ زیادہ امکان ہے، آپ کو کبھی بھی اس کی مثالیں بنانے کی ضرورت نہیں ہوگی PatternSyntaxException۔ تاہم، فارمیٹ شدہ ایرر میسج بناتے وقت آپ کو مذکورہ بالا اقدار کو نکالنے کی ضرورت ہوگی۔ ایسا کرنے کے لیے، آپ درج ذیل طریقے استعمال کر سکتے ہیں:
  • طریقہ String getDescription()نحو کی خرابی کی تفصیل لوٹاتا ہے۔
  • طریقہ int getIndex()یا تو وہ پوزیشن لوٹاتا ہے جس پر خرابی ہوئی ہے، یا اگر پوزیشن نامعلوم ہے تو -1۔
  • طریقہ String getPattern()ایک غلط ریگولر ایکسپریشن لوٹاتا ہے۔
مزید برآں، وراثت میں ملنے والا طریقہ String getMessage()سابقہ ​​طریقوں سے واپس کی گئی اقدار کے ساتھ ملٹی لائن سٹرنگ واپس کرتا ہے اس کے ساتھ اس بات کا بصری اشارہ ہے کہ ٹیمپلیٹ میں نحوی غلطی کہاں ہوئی ہے۔ نحوی غلطی کیا ہے؟ یہاں ایک مثال ہے: java RegexDemo (?itree Treehouse اس معاملے میں، ہم )نیسٹڈ فلیگ ایکسپریشن میں بند ہونے والے قوسین میٹا کریکٹر ( ) کی وضاحت کرنا بھول گئے۔ یہ اس غلطی سے آؤٹ پٹ ہے:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Regex API کا استعمال کرتے ہوئے مفید ریگولر ایکسپریشن ایپلی کیشنز بنائیں

باقاعدہ اظہار آپ کو طاقتور ٹیکسٹ پروسیسنگ ایپلی کیشنز بنانے کے قابل بناتا ہے۔ اس سیکشن میں، ہم آپ کو دو کارآمد ایپلیکیشنز دکھائیں گے جو امید ہے کہ آپ کو Regex API کلاسز اور طریقوں کو مزید دریافت کرنے کی ترغیب دیں گی۔ دوسرا ضمیمہ لیکسان کو متعارف کراتا ہے: لغوی تجزیہ کرنے کے لیے دوبارہ قابل استعمال کوڈ لائبریری۔ جاوا میں باقاعدہ اظہار، حصہ 4 - 3

باقاعدہ اظہار اور دستاویزات

پیشہ ورانہ سافٹ ویئر تیار کرتے وقت دستاویزات لازمی کاموں میں سے ایک ہے۔ خوش قسمتی سے، باقاعدہ اظہارات آپ کو دستاویزات کی تخلیق کے بہت سے پہلوؤں میں مدد کر سکتے ہیں۔ فہرست 1 کا کوڈ سورس فائل سے سنگل لائن اور ملٹی لائن سی طرز کے تبصروں پر مشتمل لائنیں نکالتا ہے اور انہیں دوسری فائل میں لکھتا ہے۔ کوڈ کے کام کرنے کے لیے، تبصرے ایک ہی لائن پر ہونے چاہئیں۔ فہرست سازی 1. تبصرے بازیافت کرنا
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class ExtCmnt
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("Способ применения: java ExtCmnt infile outfile");
         return;
      }

      Pattern p;
      try
      {
         // Следующий шаблон определяет многострочные комментарии,
         // располагающиеся в одной строке (например, /* одна строка */)
            // и однострочные комментарии (например, // Howая-то строка).
            // Комментарий может располагаться в любом месте строки.

         p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
      }
      catch (PatternSyntaxException pse)
      {
         System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
         System.err.printf("Описание ошибки: %s%n", pse.getDescription());
         System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
         System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
         return;
      }

      try (FileReader fr = new FileReader(args[0]);
           BufferedReader br = new BufferedReader(fr);
           FileWriter fw = new FileWriter(args[1]);
           BufferedWriter bw = new BufferedWriter(fw))
      {
         Matcher m = p.matcher("");
         String line;
         while ((line = br.readLine()) != null)
         {
            m.reset(line);
            if (m.matches()) /* Должна соответствовать вся строка */
            {
               bw.write(line);
               bw.newLine();
            }
         }
      }
      catch (IOException ioe)
      {
         System.err.println(ioe.getMessage());
         return;
      }
   }
}
فہرست 1 کا طریقہ main()پہلے درست کمانڈ لائن نحو کی جانچ کرتا ہے اور پھر ایک کلاس آبجیکٹ میں سنگل اور ملٹی لائن تبصروں کا پتہ لگانے کے لیے ڈیزائن کردہ ایک ریگولر ایکسپریشن مرتب کرتا ہے Pattern۔ اگر کوئی رعایت نہیں اٹھائی جاتی ہے تو PatternSyntaxException، طریقہ main()سورس فائل کو کھولتا ہے، ٹارگٹ فائل بناتا ہے، پیٹرن کے خلاف پڑھی جانے والی ہر لائن کو میچ کرنے کے لیے ایک میچر حاصل کرتا ہے، اور پھر سورس فائل لائن کو بذریعہ لائن پڑھتا ہے۔ ہر سطر کے لیے، یہ ایک تبصرہ پیٹرن کے ساتھ مماثل ہے۔ اگر کامیاب ہو تو، طریقہ main()ٹارگٹ فائل میں سٹرنگ (ایک نئی لائن کے بعد) لکھتا ہے (ہم مستقبل کے جاوا 101 ٹیوٹوریل میں فائل I/O منطق کا احاطہ کریں گے)۔ درج ذیل فہرست 1 مرتب کریں: ان پٹ کے طور پر javac ExtCmnt.java فائل کے ساتھ ایپلی کیشن چلائیں ExtCmnt.java: java ExtCmnt ExtCmnt.java out آپ کو فائل آؤٹ میں درج ذیل نتائج حاصل کرنے چاہئیں:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
پیٹرن سٹرنگ میں .*/\\*.*\\*/|.*//.*$، پائپ میٹا کریکٹر |ایک منطقی OR آپریٹر کے طور پر کام کرتا ہے، جو اس بات کی نشاندہی کرتا ہے کہ میچر کو میچر ٹیکسٹ میں میچ تلاش کرنے کے لیے دیے گئے ریگولر ایکسپریشن کنسٹرکٹ کے بائیں آپرینڈ کو استعمال کرنا چاہیے۔ اگر کوئی مماثلت نہیں ہے تو، میچر ایک اور تلاش کی کوشش کے لیے دیے گئے ریگولر ایکسپریشن کنسٹرکٹ سے صحیح آپرینڈ کا استعمال کرتا ہے (کیپچر گروپ میں قوسین میٹا کریکٹرز بھی ایک منطقی آپریٹر بناتے ہیں)۔ جاوا میں باقاعدہ اظہار، حصہ 5
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION