JavaRush /مدونة جافا /Random-AR /التعبيرات العادية في جافا، الجزء 4

التعبيرات العادية في جافا، الجزء 4

نشرت في المجموعة
نقدم انتباهكم إلى ترجمة دليل قصير للتعبيرات العادية في Java، كتبه Jeff Friesen لموقع javaworld . ولتسهيل القراءة قمنا بتقسيم المقال إلى عدة أجزاء. التعبيرات العادية في جافا، الجزء 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(). إذا كان موقع الخطأ في بناء الجملة غير معروف، يتم تعيين القيمة إلى . على الأرجح، لن تحتاج أبدًا إلى إنشاء مثيلات لـ . ومع ذلك، سوف تحتاج إلى استخراج القيم المذكورة أعلاه عند إنشاء رسالة خطأ منسقة. للقيام بذلك، يمكنك استخدام الطرق التالية: PatternPatternSyntaxException(String desc, String regex, int index)descregexindex-1PatternSyntaxException
  • تقوم الطريقة 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 الأسطر التي تحتوي على تعليقات ذات سطر واحد ومتعددة الأسطر على نمط C من ملف مصدر ويكتبها في ملف آخر. لكي يعمل الكود، يجب أن تكون التعليقات على نفس السطر. القائمة 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;
      }
   }
}
تتحقق الطريقة main()الموجودة في القائمة 1 أولاً من بناء جملة سطر الأوامر الصحيح ثم تقوم بتجميع تعبير عادي مصمم لاكتشاف التعليقات الفردية والمتعددة الأسطر في كائن فئة Pattern. إذا لم يتم ظهور أي استثناء PatternSyntaxException، تفتح الطريقة main()الملف المصدر، وتنشئ الملف الهدف، وتحصل على مُطابق لمطابقة كل سطر مقروء مقابل النمط، ثم تقرأ الملف المصدر سطرًا تلو الآخر. لكل سطر، يتم مطابقته مع نمط التعليق. إذا نجحت، فستكتب الطريقة main()السلسلة (متبوعة بسطر جديد) إلى الملف الهدف (سنغطي منطق الإدخال/الإخراج للملف في برنامج تعليمي مستقبلي لـ Java 101). قم بتجميع القائمة 1 كما يلي: javac ExtCmnt.java قم بتشغيل التطبيق باستخدام الملف ExtCmnt.javaكمدخل: java ExtCmnt ExtCmnt.java out يجب أن تحصل على النتائج التالية في الملف:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
في سلسلة النمط .*/\\*.*\\*/|.*//.*$، يعمل الحرف التعريفي الأنبوبي |كعامل تشغيل منطقي أو، مما يشير إلى أن المطابق يجب أن يستخدم المعامل الأيسر لبناء التعبير العادي المحدد للعثور على تطابق في نص المطابق. إذا لم تكن هناك أي تطابقات، فإن المطابق يستخدم المعامل الصحيح من بنية التعبير العادي المحددة لمحاولة بحث أخرى (تشكل الأحرف الأولية للأقواس في المجموعة الملتقطة أيضًا عامل تشغيل منطقي). التعبيرات العادية في جافا، الجزء 5
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION