JavaRush /وبلاگ جاوا /Random-FA /عبارات منظم در جاوا، قسمت 4

عبارات منظم در جاوا، قسمت 4

در گروه منتشر شد
ترجمه‌ای از راهنمای کوتاه برای عبارات منظم در جاوا را که توسط جف فریسن برای وب‌سایت 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()کلاس پرتاب می کند 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 را بیشتر بررسی کنید. ضمیمه دوم Lexan را معرفی می کند: یک کتابخانه کد قابل استفاده مجدد برای انجام تحلیل واژگانی. عبارات منظم در جاوا، قسمت 4 - 3

عبارات و مستندات منظم

مستندسازی یکی از وظایف اجباری در هنگام توسعه نرم افزارهای حرفه ای است. خوشبختانه، عبارات منظم می توانند در بسیاری از جنبه های ایجاد مستندات به شما کمک کنند. کد موجود در Listing 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()رشته را (به دنبال آن یک خط جدید) در فایل هدف می نویسد (منطق فایل ورودی/خروجی را در آموزش آتی جاوا 101 پوشش خواهیم داد). فهرست 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