Tutulan qruplarla iş üsulları
Tətbiqin mənbə kodunaRegexDemo
metod ç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ırIllegalStateException
. -
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ırgroup
. Qeyd edək ki, bugroup(0)
, -ə bərabərdirgroup()
. Şablonda verilmiş nömrə ilə tutulmuş qrup yoxdursa, metod istisna atırIndexOutOfBoundsException
. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılırIllegalStateException
. -
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ırIllegalArgumentException
. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılırIllegalStateException
.
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

Uyğun mövqelərin müəyyən edilməsi üsulları
SinifMatcher
matçı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ırIllegalStateException
. -
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ırgroup
. Şablonda verilmiş nömrə ilə tutulmuş qrup yoxdursa, metod istisna atırIndexOutOfBoundsException
. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılırIllegalStateException
. -
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ırname
. Tutulan qrupname
şablonda deyilsə, istisna atılırIllegalArgumentException
. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılırIllegalStateException
. -
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ırIllegalStateException
. -
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ırgroup
. Şablonda verilmiş nömrə ilə tutulmuş qrup yoxdursa, metod istisna atırIndexOutOfBoundsException
. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılırIllegalStateException
. -
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ırname
. Tutulan qrupname
şablonda deyilsə, istisna atılırIllegalArgumentException
. Əgər həlledici hələ axtarış aparmayıbsa və ya əvvəlki axtarış əməliyyatı uğursuz olarsa, istisna atılırIllegalStateException
.
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əsiPatternSyntaxException
müntəzəm ifadədə sintaksis xətasını təsvir edir. Metodlardan compile()
və matches()
sinifdən belə bir istisna atır Pattern
və 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 index
tə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.
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ı.
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.java
giriş 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ə
GO TO FULL VERSION