JavaWorld vebsaytı üçün Jeff Friesen tərəfindən yazılmış Java dilində müntəzəm ifadələrə dair qısa bələdçinin tərcüməsini diqqətinizə çatdırırıq . Oxumaq asanlığı üçün məqaləni bir neçə hissəyə ayırdıq.
Nümunələri tanımaq və təsvir etmək üçün Java Proqramlarında Daimi İfadə API-dən istifadə
Java-nın xarakteri və müxtəlif simli məlumat növləri nümunə uyğunluğu üçün aşağı səviyyəli dəstək təmin edir, lakin bu məqsəd üçün onlardan istifadə adətən əhəmiyyətli kod mürəkkəbliyi əlavə edir. Regex API ("Regular Expression API") istifadə edərək daha sadə və daha effektiv kod əldə edilir. Bu dərslik sizə müntəzəm ifadələr və Regex API ilə başlamağa kömək edəcək. Əvvəlcə paketdəki ən maraqlı üç sinfi müzakirə edəcəyik
java.util.regex
, sonra sinfin içərisinə nəzər salıb
Pattern
onun mürəkkəb naxışa uyğun konstruksiyalarını araşdıracağıq.
Diqqət: Siz bu məqalədən demo proqramın mənbə kodunu (JavaWorld saytı üçün Jeff Friesen tərəfindən yaradılmışdır)
buradan yükləyə bilərsiniz .
Normal ifadələr hansılardır?
Normal ifadə (müntəzəm ifadə/regex/regexp) müəyyən sətirlər dəstini təsvir edən nümunə olan sətirdir. Nümunə hansı sıraların çoxluğa aid olduğunu müəyyənləşdirir. Nümunə hərfi və metaxarakterlərdən - hərfi mənadan daha çox xüsusi məna daşıyan simvollardan ibarətdir. Nümunə uyğunluğu uyğunluqları, yəni müntəzəm ifadə nümunəsinə uyğun gələn sətirləri tapmaq üçün mətn axtarışıdır. Java, Regex API vasitəsilə nümunə uyğunluğunu dəstəkləyir. Bu API üç sinifdən ibarətdir:
Pattern
,
Matcher
və
PatternSyntaxException
, paketdə yerləşir
java.util.regex
:
- sinif obyektləri
Pattern
, həmçinin şablon adlanır, müntəzəm ifadələr tərtib edilir.
- sinif obyektləri
Matcher
və ya uyğunlaşdırıcılar simvol ardıcıllığında uyğunluq tapmaq üçün nümunənin şərh mexanizmləridir (sinifləri interfeys həyata keçirən java.lang.CharSequence
və mətn mənbəyi kimi xidmət edən obyektlər).
- Sinif obyektləri
PatternSyntaxException
etibarsız müntəzəm ifadə nümunələrini təsvir etmək üçün istifadə olunur.
Java həmçinin
java.lang.String
. Məsələn, funksiya yalnız çağıran sətir normal ifadəyə tam uyğun gələrsə
boolean matches (String regex)
qaytarır .
true
regex
Rahat üsullar |
matches() və sinfin digər müntəzəm ifadə yönümlü rahatlıq üsulları String Regex API-yə bənzər şəkildə başlıq altında həyata keçirilir. |
RegexDemo
Java müntəzəm ifadələrini və , və
RegexDemo
müxtəlif üsullarını nümayiş etdirmək üçün proqram yaratdım . Aşağıda bu demo proqram üçün mənbə kodu verilmişdir. Siyahı 1. Müntəzəm ifadə nümayişi
Pattern
Matcher
PatternSyntaxException
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("usage: java RegexDemo regex input");
return;
}
args[1] = args[1].replaceAll("\\\\n", "\n");
try
{
System.out.println("regex = " + args[0]);
System.out.println("input = " + args[1]);
Pattern p = Pattern.compile(args[0]);
Matcher m = p.matcher(args[1]);
while (m.find())
System.out.println("Found [" + m.group() + "] starting at "
+ m.start() + " and ending at " + (m.end() - 1));
}
catch (PatternSyntaxException pse)
{
System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
System.err.println("Описание: " + pse.getDescription());
System.err.println("Позиция: " + pse.getIndex());
System.err.println("Неправильный шаблон: " + pse.getPattern());
}
}
}
main
Sinif metodunun etdiyi ilk şey
RegexDemo
onun əmr xəttini yoxlamaqdır. Bunun üçün iki arqument tələb olunur: birincisi müntəzəm ifadə, ikincisi isə nizamlı ifadənin axtarılacağı giriş mətnidir. Siz daxil edilmiş mətn daxilində yeni sətir simvolundan istifadə etməli ola bilərsiniz
(\n)
.
\
Bu, yalnız simvoldan sonra simvol göstərilməklə edilə bilər
n
. Funksiya
main()
bu simvol ardıcıllığını Unicode dəyəri 10-a çevirir.
Kodun əsas
RegexDemo
hissəsi
try-catch
. Blok əvvəlcə verilmiş müntəzəm ifadəni və daxil edilmiş mətni çıxarır, sonra isə tərtib edilmiş müntəzəm ifadəni saxlayan
try
obyekt yaradır (naxış uyğunluğu performansını yaxşılaşdırmaq üçün adi ifadələr tərtib edilir).
Pattern
Obyektdən uyğunlaşdırıcı çıxarılır
Pattern
və hamısı tapılana qədər iterativ olaraq uyğunluqları axtarmaq üçün istifadə olunur. Blok istisna haqqında faydalı məlumat əldə etmək üçün
catch
bir neçə sinif metodunu çağırır .
PatternSyntaxException
Bu məlumat ardıcıl olaraq çıxış axınına verilir. Hələlik kodun necə işlədiyinin təfərrüatlarını bilməyə ehtiyac yoxdur: bunlar məqalənin ikinci hissəsində API-ni öyrəndikdə aydınlaşacaq. Bununla belə, siz Siyahı 1-i tərtib etməlisiniz. Siyahı 1-dən kodu götürün və sonra tərtib etmək üçün əmr sorğusuna aşağıdakı əmri yazın
RegexDemo
:
javac RegexDemo.java
Pattern sinfi və onun konstruksiyaları
Regex API-ni təşkil edən üç sinifdən birincisi olan sinif
Pattern
müntəzəm ifadənin tərtib edilmiş təsviridir. Sinif SDK sənədləri
Pattern
müxtəlif müntəzəm ifadə konstruksiyalarını təsvir edir, lakin siz müntəzəm ifadələrdən aktiv şəkildə istifadə etmirsinizsə, bu sənədlərin hissələri çaşdırıcı ola bilər. Kəmiyyət göstəriciləri nədir və acgöz, istəksiz və sahib kəmiyyət göstəriciləri arasındakı fərq nədir? Xarakter sinifləri, sərhəd uyğunlaşdırıcıları, arxa istinadlar və daxil edilmiş bayraq ifadələri nədir? Bu və digər suallara növbəti bölmələrdə cavab verəcəyəm.
Hərfi sətirlər
Ən sadə müntəzəm ifadə quruluşu hərfi sətirdir. Nümunə uyğunluğunun uğurlu olması üçün daxil edilən mətnin bəzi hissəsi həmin konstruktun nümunəsinə uyğun olmalıdır. Aşağıdakı nümunəyə nəzər salın: Bu misalda biz daxil edilmiş mətndə
java RegexDemo apple applet
nümunə üçün uyğunluq tapmağa çalışırıq . Aşağıdakı nəticə tapılan uyğunluğu göstərir:
apple
applet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Çıxışda müntəzəm ifadəni və giriş mətnini, sonra isə
apple
appletdə uğurlu aşkarlamanın göstəricisini görürük. Bundan əlavə, bu matçın başlanğıc və bitmə mövqeləri verilmişdir:
0
və
4
müvafiq olaraq. Başlanğıc mövqeyi mətndə uyğunluğun tapıldığı ilk yeri, son mövqe isə matçın son nöqtəsini göstərir. İndi deyək ki, biz aşağıdakı əmr xəttini verdik:
java RegexDemo apple crabapple
Bu dəfə fərqli başlanğıc və bitmə mövqeləri ilə aşağıdakı nəticəni alırıq:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Əks halda,
applet
müntəzəm ifadə ilə
apple
- daxil edilən mətnlə heç bir uyğunluq tapılmayacaq.
t
Bütün normal ifadə uyğun olmalıdır, lakin bu halda, daxil olan mətndə -dən sonra ifadə yoxdur
apple
.
Meta personajlar
Daha maraqlı müntəzəm ifadə konstruksiyaları hərfi simvolları metasimvollarla birləşdirir. Məsələn, müntəzəm ifadədə
a.b
nöqtə metaxarakteri və b
(.)
arasındakı hər hansı simvol deməkdir
a
. Aşağıdakı nümunəyə nəzər salın:
java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
Bu nümunə
.ox
həm müntəzəm ifadə, həm də
The quick brown fox jumps over the lazy ox.
daxiletmə mətni kimi istifadə edir.
RegexDemo
mətndə hər hansı simvolla başlayan və ilə bitən uyğunluqları axtarır
ox.
Onun icrasının nəticələri aşağıdakı kimidir:
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
Çıxışda iki uyğunluq görürük:
fox
və
ox
(qarşısında boşluq simvolu ilə). Metaxarakter birinci halda
.
xarakterə, ikinci halda isə boşluğa uyğun gəlir . Onu metaxarakterlə
f
əvəz etsəniz nə olar ? Yəni, aşağıdakı əmr xətti nəticəsində əldə etdiyimiz şey: Nöqtə metaxarakteri istənilən simvola uyğun gəldiyi üçün daxil edilmiş mətnin bütün simvolları (arxadakı nöqtə simvolu daxil olmaqla) üçün tapılan uyğunluqları çıxaracaq:
.ox
.
java RegexDemo . "The quick brown fox jumps over the lazy ox."
RegexDemo
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
Sitat meta simvolları |
Normal ifadə konstruksiyasında hərfi simvol kimi və ya hər hansı digər metaxarakteri təyin etmək üçün . aşağıdakı yollardan biri ilə ondan qaçmalısınız:
- əks kəsik işarəsi ilə ondan əvvəl;
- Bu metaxarakteri
\Q və arasında yerləşdirin \E (məsələn, \Q.\E ).
Sətir literalında görünən hər hansı simvolları, məsələn, String regex = "\\."; əks xətlər (məsələn, \\. və ya \\Q.\\E ) təkrarlamağı unutmayın. Komanda xətti arqumentinin bir hissəsi olan əks kəsikləri təkrarlamayın. |
Xarakter sinifləri
Bəzən axtardığınız uyğunluğu müəyyən bir simvol dəsti ilə məhdudlaşdırmalı olursunuz. Məsələn, mətndə
a
,
e
,
i
və saitləri axtarın
o
,
u
sait hərfinin hər dəfə rast gəlinməsi uyğunluq sayılır. Bu cür problemlərin həllində bizə kvadrat mötərizələrin ( ) metasimvolları arasında simvol dəstlərini təyin edən simvol sinifləri kömək edəcəkdir
[ ]
. Sinif
Pattern
sadə simvol siniflərini, diapazon siniflərini, tərs, birləşmə, kəsişmə və çıxma siniflərini dəstəkləyir. İndi onların hamısına baxacağıq.
Sadə xarakter sinifləri
Sadə simvol sinfi yan-yana yerləşdirilmiş simvollardan ibarətdir və yalnız həmin simvollara uyğun gəlir. Məsələn, sinif
[abc]
simvollara uyğun gəlir
a
və
b
.
c
Aşağıdakı misalı nəzərdən keçirin:
java RegexDemo [csw] cave
Nəticələrdən göründüyü kimi, bu nümunədə yalnız
c
uyğunluğu olan simvol
cave
:
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0
Ters çevrilmiş xarakter sinifləri
Ters çevrilmiş simvol sinfi metaxarakterlə başlayır
^
və yalnız onun tərkibində olmayan simvollara uyğun gəlir. Məsələn, sinif, və istisna olmaqla ,
[^abc]
bütün simvollara uyğun gəlir . Aşağıdakı nümunəyə nəzər salın: Qeyd edək ki, mənim əməliyyat sistemimdə (Windows) ikiqat dırnaq işarələri tələb olunur, çünki qabıq onları qaçış simvolu kimi qəbul edir. Gördüyünüz kimi, bu nümunədə yalnız və simvolları tapıldı , bunlar üçün uyğunluqlar var :
a
b
c
java RegexDemo "[^csw]" cave
^
a
v
e
cave
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3
Diapazon xarakter sinifləri
Aralıq simvol sinfi defis (
-
) ilə ayrılmış iki simvoldan ibarətdir. Tirenin solundakı simvoldan başlayaraq sağdakı simvolla bitən bütün simvollar diapazonun bir hissəsidir. Məsələn, diapazon
[a-z]
bütün kiçik Latın hərflərinə uyğun gəlir. Bu, sadə bir sinfi təyin etməyə bərabərdir
[abcdefghijklmnopqrstuvwxyz]
. Aşağıdakı nümunəyə nəzər salın: Bu nümunə yalnız uyğunluğu olan
java RegexDemo [a-c] clown
xarakterə uyğun olacaq :
c
clown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java-da müntəzəm ifadələr, 2-ci hissə Java-da müntəzəm ifadələr, 3-cü hissə Java-da müntəzəm ifadələr, 4-cü hissə Java-da müntəzəm ifadələr, 5-ci hissə
Başqa nə oxumaq lazımdır: |
|
GO TO FULL VERSION