JavaRush /Java Blogu /Random-AZ /Java-da müntəzəm ifadələr, 4-cü hissə

Java-da müntəzəm ifadələr, 4-cü hissə

Qrupda dərc edilmişdir
Diqqətinizə Ceff Friesen tərəfindən javaworld veb-saytı üçün yazılmış Java-da müntəzəm ifadələrə dair qısa bələdçinin tərcüməsini təqdim edirik . Oxumaq asanlığı üçün məqaləni bir neçə hissəyə ayırdıq. Java-da müntəzəm ifadələr, 4-cü hissə - 1 Java-da müntəzəm ifadələr, 1-ci hissə Java-da müntəzəm ifadələr, 2-ci hissə Java-da müntəzəm ifadələr, 3-cü hissə

Tutulan qruplarla iş üsulları

Tətbiqin mənbə koduna RegexDemometod çağırışı daxildir m.group(). Metod, tutulan qruplarla işləməyə yönəlmiş group()sinifin bir neçə metodundan biridir :Matcher
  • Metod int groupCount()həlledici modeldə tutulan qrupların sayını qaytarır. Bu nömrə bütövlükdə naxışa uyğun gələn 0 nömrəli xüsusi tutma qrupunu nəzərə almır.

  • Metod String group()əvvəlki tapılmış uyğunluğun simvollarını qaytarır. Boş sətir üçün uğurlu axtarış haqqında məlumat vermək üçün bu üsul boş sətir qaytarır. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

  • Metod String group(int group)əvvəlki metoda bənzəyir, istisna olmaqla, o, parametrlə müəyyən edilmiş qrup nömrəsi ilə ələ keçirilən əvvəlki tapılmış uyğunluğun simvollarını qaytarır group. Qeyd edək ki, bu group(0), -ə bərabərdir group(). Şablonda verilmiş nömrə ilə tutulmuş qrup yoxdursa, metod istisna atır IndexOutOfBoundsException. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

  • Metod, String group(String name)ad qrupu tərəfindən tutulan əvvəlki tapılmış uyğunluğun simvollarını qaytarır. Tutulan qrup adı şablonda deyilsə, istisna atılır IllegalArgumentException. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

groupCount()Aşağıdakı nümunə və metodların istifadəsini nümayiş etdirir 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));
İcra nəticələri:
3
0: abc
1: abc
2: bc
3: c
Java-da müntəzəm ifadələr, 4-cü hissə - 2

Uyğun mövqelərin müəyyən edilməsi üsulları

Sinif Matchermatçın başlanğıc və son mövqelərini qaytaran bir neçə üsul təqdim edir:
  • Metod int start()əvvəlki tapılmış uyğunluğun başlanğıc mövqeyini qaytarır. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

  • Metod int start(int group)əvvəlki metoda bənzəyir, lakin nömrəsi parametrlə müəyyən edilən qrup üçün tapılmış əvvəlki uyğunluğun başlanğıc mövqeyini qaytarır group. Şablonda verilmiş nömrə ilə tutulmuş qrup yoxdursa, metod istisna atır IndexOutOfBoundsException. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

  • Metod int start(String name)əvvəlki üsula bənzəyir, lakin adlı qrup üçün tapılan əvvəlki matçın başlanğıc mövqeyini qaytarır name. Tutulan qrup nameşablonda deyilsə, istisna atılır IllegalArgumentException. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

  • Metod int end()əvvəlki tapılmış uyğunluğun son simvolunun mövqeyini üstəgəl 1 qaytarır. Əgər uyğunlaşdırıcı hələ uyğunluğu yerinə yetirməyibsə və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

  • Metod int end(int group)əvvəlki metoda bənzəyir, lakin nömrəsi parametrlə müəyyən edilən qrup üçün tapılmış əvvəlki uyğunluğun bitmə mövqeyini qaytarır group. Şablonda verilmiş nömrə ilə tutulmuş qrup yoxdursa, metod istisna atır IndexOutOfBoundsException. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

  • Metod int end(String name)əvvəlki üsula bənzəyir, lakin adlı qrup üçün tapılan əvvəlki uyğunluğun bitmə mövqeyini qaytarır name. Tutulan qrup nameşablonda deyilsə, istisna atılır IllegalArgumentException. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılır IllegalStateException.

Aşağıdakı nümunə 2 nömrəli tutma qrupu üçün başlanğıc/son uyğunluq mövqelərini çıxaran iki uyğunluq yeri metodunu nümayiş etdirir:
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();
}
Bu nümunənin nəticəsi aşağıdakı kimidir:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

PatternSyntaxException sinifinin metodları

Sinfin nümunəsi PatternSyntaxExceptionmüntəzəm ifadədə sintaksis xətasını təsvir edir. Metodlardan compile()matches()sinifdən belə bir istisna atır Patternvə aşağıdakı konstruktor vasitəsilə formalaşır: PatternSyntaxException(String desc, String regex, int index) Bu konstruktor göstərilən təsviri ( desc), müntəzəm ifadəni ( regex) və sintaksis xətasının baş verdiyi mövqeyi saxlayır. Sintaksis xətasının yeri bilinmirsə, dəyər indextəyin edilir -1. Çox güman ki, heç vaxt PatternSyntaxException. Bununla belə, formatlaşdırılmış səhv mesajı yaratarkən yuxarıdakı dəyərləri çıxarmaq lazımdır. Bunu etmək üçün aşağıdakı üsullardan istifadə edə bilərsiniz:
  • Metod String getDescription()sintaksis xətasının təsvirini qaytarır.
  • Metod int getIndex()ya xətanın baş verdiyi mövqeyi qaytarır, ya da mövqe məlum deyilsə -1.
  • Metod String getPattern()etibarsız müntəzəm ifadə qaytarır.
Bundan əlavə, irsi üsul String getMessage()şablonda sintaksis xətasının baş verdiyi yerin vizual göstəricisi ilə birlikdə əvvəlki metodlardan qaytarılmış dəyərlərlə çoxsətirli sətir qaytarır. Sintaksis xətası nədir? Budur bir misal: java RegexDemo (?itree Treehouse Bu halda biz )iç içə bayraq ifadəsində bağlanan mötərizə metaxarakterini ( ) təyin etməyi unutmuşuq. Bu xətanın nəticəsi budur:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Regex API-dən istifadə edərək Faydalı Normal İfadə Tətbiqləri qurun

Daimi ifadələr sizə güclü mətn emal proqramları yaratmağa imkan verir. Bu bölmədə biz sizə Regex API sinifləri və üsullarını daha da araşdırmağa təşviq edəcək iki lazımlı proqram göstərəcəyik. İkinci əlavədə Lexan təqdim olunur: leksik təhlilin aparılması üçün təkrar istifadə edilə bilən kod kitabxanası. Java-da müntəzəm ifadələr, 4-3-cü hissə

Adi ifadələr və sənədlər

Peşəkar proqram təminatının hazırlanması zamanı sənədləşdirmə məcburi vəzifələrdən biridir. Xoşbəxtlikdən, müntəzəm ifadələr sənədlərin yaradılmasının bir çox aspektlərində sizə kömək edə bilər. Siyahı 1-dəki kod bir sətirli və çoxsətirli C tipli şərhləri ehtiva edən sətirləri mənbə faylından çıxarır və onları başqa fayla yazır. Kodun işləməsi üçün şərhlər eyni sətirdə olmalıdır. Siyahı 1. Şərhlərin alınması
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;
      }
   }
}
Siyahı 1-dəki üsul main()əvvəlcə düzgün əmr xətti sintaksisini yoxlayır və sonra sinif obyektində tək və çox sətirli şərhləri aşkar etmək üçün nəzərdə tutulmuş müntəzəm ifadəni tərtib edir Pattern. Heç bir istisna qaldırılmazsa PatternSyntaxException, metod main()mənbə faylını açır, hədəf faylı yaradır, nümunə ilə oxunan hər sətirə uyğunlaşdırmaq üçün uyğunlaşdırıcı əldə edir və sonra mənbə faylını sətir-sətir oxuyur. Hər bir sətir üçün şərh nümunəsi ilə uyğunlaşdırılır. Uğurlu olarsa, metod main()sətri (ardınca yeni sətir) hədəf fayla yazır (biz gələcək Java 101 təlimatında faylın I/O məntiqini əhatə edəcəyik). Siyahı 1-i aşağıdakı kimi tərtib edin: javac ExtCmnt.java Tətbiqi faylı ExtCmnt.javagiriş kimi işlədin: java ExtCmnt ExtCmnt.java out Faylda aşağıdakı nəticələri əldə etməlisiniz:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
Nümunə sətirində .*/\\*.*\\*/|.*//.*$boru metaxarakteri |məntiqi OR operatoru kimi çıxış edir və bu onu göstərir ki, uyğunlaşdırıcı mətndə uyğunluğu tapmaq üçün verilmiş müntəzəm ifadə konstruksiyasının sol operandından istifadə etməlidir. Uyğunluqlar olmadıqda, uyğunlaşdırıcı başqa bir axtarış cəhdi üçün verilmiş müntəzəm ifadə konstruksiyasından sağ operanddan istifadə edir (tutulmuş qrupdakı mötərizə metasimvolları da məntiqi operator təşkil edir). Java-da müntəzəm ifadələr, 5-ci hissə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION