Sizning e'tiboringizga JavaWorld veb-sayti uchun Jeff Friesen tomonidan yozilgan Java tilidagi muntazam iboralar bo'yicha qisqacha qo'llanmaning tarjimasini keltiramiz . O'qish qulayligi uchun biz maqolani bir necha qismga ajratdik.
Naqshlarni tanib olish va tavsiflash uchun Java dasturlarida Regular Expression API-dan foydalanish
Java-ning xarakteri va turli qatorli ma'lumotlar turlari naqshlarni moslashtirish uchun past darajadagi yordamni ta'minlaydi, ammo bu maqsadda ulardan foydalanish odatda sezilarli kod murakkabligini oshiradi. Oddiyroq va samaraliroq kod Regex API ("Regular Expression API") yordamida olinadi. Ushbu o'quv qo'llanma muntazam ifodalar va Regex API bilan ishlashni boshlashga yordam beradi. Biz birinchi navbatda paketdagi eng qiziqarli uchta sinfni muhokama qilamiz
java.util.regex
, so'ngra sinfning ichki qismini ko'rib chiqamiz
Pattern
va uning naqshga mos keladigan murakkab tuzilmalarini o'rganamiz.
Diqqat: Demo ilovaning manba kodini (JavaWorld sayti uchun Jeff Friesen tomonidan yaratilgan) ushbu maqoladan
shu yerdan yuklab olishingiz mumkin .
Muntazam iboralar nima?
Muntazam ifoda (muntazam ifoda/regex/regexp) ma'lum qatorlar to'plamini tavsiflovchi naqsh bo'lgan qatordir. Naqsh qaysi qatorlar to'plamga tegishli ekanligini aniqlaydi. Naqsh to'g'ridan-to'g'ri va metabelgilardan iborat - to'g'ridan-to'g'ri emas, balki maxsus ma'noga ega bo'lgan belgilar. Pattern matching - bu mosliklarni, ya'ni oddiy ifoda naqshiga mos keladigan satrlarni topish uchun matnni qidirish. Java o'zining Regex API orqali naqsh mosligini qo'llab-quvvatlaydi. Ushbu API uchta sinfdan iborat:
Pattern
,
Matcher
va
PatternSyntaxException
, paketda joylashgan
java.util.regex
:
- shablon deb ham ataladigan sinf ob'ektlari
Pattern
muntazam ifodalardir.
- sinf ob'ektlari
Matcher
yoki mos keluvchilar - belgilar ketma-ketligidagi mosliklarni topish uchun naqshni talqin qilish mexanizmlari (sinflari interfeysni amalga oshiradigan java.lang.CharSequence
va matn manbalari sifatida xizmat qiladigan ob'ektlar).
- Sinf ob'ektlari
PatternSyntaxException
noto'g'ri muntazam ifoda naqshlarini tasvirlash uchun ishlatiladi.
Java, shuningdek, turli xil usullar orqali naqshlarni moslashtirishni qo'llab-quvvatlaydi
java.lang.String
. Misol uchun, funktsiya faqat chaqiruvchi satr muntazam ifodaga to'liq mos keladigan bo'lsa,
boolean matches (String regex)
qaytadi .
true
regex
Qulay usullar |
matches() va sinfning boshqa muntazam ifodaga yo'naltirilgan qulaylik usullari String kaput ostida Regex API-ga o'xshash tarzda amalga oshiriladi. |
RegexDemo
Men Java muntazam ifodalarini va , va
RegexDemo
ning turli usullarini namoyish qilish uchun dastur yaratdim . Quyida ushbu demo ilovaning manba kodi keltirilgan. Listing 1. Muntazam ifoda namoyishi
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
Sinf usuli qiladigan birinchi narsa
RegexDemo
uning buyruq satrini tekshirishdir. Bu ikkita argumentni talab qiladi: birinchisi muntazam ifoda, ikkinchisi esa muntazam ifoda qidiriladigan kirish matni. Kiritilgan matn ichida yangi qator belgisidan foydalanish kerak bo'lishi mumkin
(\n)
.
\
Buni faqat belgidan keyin belgini belgilash orqali amalga oshirish mumkin
n
. Funktsiya
main()
ushbu belgilar ketma-ketligini Unicode qiymatiga o'zgartiradi 10.
Kodning asosiy
RegexDemo
qismi
try-catch
. Blok
try
avval berilgan muntazam ifodani va kiritilgan matnni chiqaradi, so'ngra
Pattern
kompilyatsiya qilingan muntazam ifodani saqlaydigan ob'ektni yaratadi (odatiy iboralar naqsh mosligini yaxshilash uchun kompilyatsiya qilinadi). Ob'ektdan mos keluvchi chiqariladi
Pattern
va barchasi topilmaguncha iterativ ravishda mosliklarni qidirish uchun ishlatiladi. Blok istisno haqida foydali ma'lumotlarni olish uchun
catch
bir nechta sinf usullarini chaqiradi .
PatternSyntaxException
Ushbu ma'lumot ketma-ket chiqish oqimiga chiqariladi. Kod qanday ishlashi haqida tafsilotlarni bilishning hojati yo'q: ular maqolaning ikkinchi qismida APIni o'rganganimizda aniq bo'ladi. Biroq, siz Listing 1ni kompilyatsiya qilishingiz kerak. 1-listdan kodni oling va kompilyatsiya qilish uchun buyruq satriga quyidagi buyruqni kiriting
RegexDemo
:
javac RegexDemo.java
Pattern sinfi va uning konstruksiyalari
Regex API-ni tashkil etuvchi uchta sinfdan birinchisi bo'lgan sinf
Pattern
muntazam ifodaning kompilyatsiya qilingan ko'rinishidir. Sinf SDK hujjatlari
Pattern
turli xil muntazam ifoda konstruksiyalarini tavsiflaydi, lekin agar siz muntazam ifodalardan faol foydalanmasangiz, ushbu hujjatning qismlari chalkash boʻlishi mumkin. Miqdor ko'rsatkichlari nima va ochko'z, istaksiz va egalik kvantlari o'rtasidagi farq nima? Belgilar sinflari, chegara moslamalari, orqaga havolalar va o'rnatilgan bayroq ifodalari nima? Men ushbu va boshqa savollarga keyingi bo'limlarda javob beraman.
Literal satrlar
Eng oddiy oddiy ifoda konstruksiyasi bu literal satrdir. Shaklni moslashtirish muvaffaqiyatli bo'lishi uchun kiritilgan matnning bir qismi ushbu konstruksiya naqshiga mos kelishi kerak. Quyidagi misolni ko'rib chiqing: Ushbu misolda biz kiritilgan matndagi
java RegexDemo apple applet
naqsh uchun moslikni topishga harakat qilmoqdamiz . Quyidagi natija topilgan o'yinni ko'rsatadi:
apple
applet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Biz chiqishda muntazam ifodani va kiritilgan matnni, so'ngra
apple
appletda muvaffaqiyatli aniqlash belgisini ko'ramiz. Bundan tashqari, ushbu o'yinning boshlang'ich va yakuniy pozitsiyalari berilgan:
0
va
4
, mos ravishda. Boshlang'ich pozitsiyasi matndagi o'yin topilgan birinchi o'rinni, yakuniy pozitsiya esa o'yinning oxirgi nuqtasini ko'rsatadi. Keling, biz quyidagi buyruq qatorini berdik, deylik:
java RegexDemo apple crabapple
Bu safar biz turli xil boshlang'ich va tugatish pozitsiyalari bilan quyidagi natijani olamiz:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Aks holda, va
applet
muntazam ifoda sifatida
apple
- kiritilgan matn bilan hech qanday moslik topilmaydi. Butun muntazam ifoda mos kelishi kerak, lekin bu holda, kiritilgan matnda
t
dan keyin mavjud emas
apple
.
Meta belgilar
Yana qiziqarli muntazam ifoda konstruksiyalari tom ma'nodagi belgilarni metabelgilar bilan birlashtiradi. Misol uchun, muntazam ifodada
a.b
nuqta metabelgisi va b
(.)
orasidagi har qanday belgini bildiradi .
a
Quyidagi misolni ko'rib chiqing: Bu misol oddiy ifoda sifatida ham, kiritish matni sifatida ham
java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
foydalanadi . matndan istalgan belgidan boshlanib, bilan tugaydigan mosliklarni qidiradi, uning bajarilishi natijalari quyidagicha:
.ox
The quick brown fox jumps over the lazy ox.
RegexDemo
ox.
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
Chiqishda biz ikkita moslikni ko'ramiz:
fox
va
ox
(oldida bo'sh joy belgisi bilan). Metabelgi birinchi holatda
.
belgiga, ikkinchi holatda bo'sh joyga mos keladi . Agar uni metabelgi bilan
f
almashtirsangiz nima bo'ladi ? Ya'ni, biz quyidagi buyruq qatori natijasida nima olamiz: Nuqta meta-belgi har qanday belgiga mos kelganligi sababli, kiritilgan matnning barcha belgilari (shu jumladan, orqadagi nuqta belgisi) uchun topilgan mosliklarni chiqaradi:
.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
Iqtibos meta-belgilar |
. Muntazam ifoda konstruksiyasida tom maʼnodagi belgi sifatida yoki boshqa metabelgilarni belgilash uchun siz quyidagi usullardan biri bilan undan qochishingiz kerak:
- uning oldiga teskari chiziq belgisini qo'ying;
- Ushbu metabelgini
\Q va orasiga qo'ying \E (masalan, \Q.\E ).
Satr harfida paydo bo'ladigan har qanday belgilarni takrorlashni unutmang, masalan, String regex = "\\."; teskari chiziq (masalan, \\. yoki \\Q.\\E ). Buyruqlar qatori argumentining bir qismi bo'lgan teskari chiziqlarni takrorlamang. |
Qahramonlar sinflari
Ba'zan siz izlayotgan o'yinlarni ma'lum belgilar to'plami bilan cheklashingiz kerak. Masalan, matndan
a
,
e
,
i
,
o
va unlilarini qidiring
u
, unli harfning har bir kelishi mos keladi. Bunday muammolarni hal qilishda bizga kvadrat qavslar meta-belgilari orasidagi belgilar to'plamini belgilaydigan belgilar sinflari yordam beradi (
[ ]
). Sinf
Pattern
oddiy belgilar sinflarini, diapazon sinflarini, teskari, birlashma, kesishish va ayirish sinflarini qo'llab-quvvatlaydi. Biz hozir ularning barchasini ko'rib chiqamiz.
Oddiy belgilar sinflari
Oddiy belgilar sinfi yonma-yon joylashtirilgan belgilardan iborat va faqat shu belgilarga mos keladi. Masalan, sinf , va belgilariga
[abc]
mos keladi . Quyidagi misolni ko'rib chiqing: Natijalardan ko'rinib turibdiki, bu misolda faqat mos keladigan belgi :
a
b
c
java RegexDemo [csw] cave
c
cave
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0
Inverted belgilar sinflari
Invertli belgilar sinfi metabelgidan boshlanadi
^
va faqat unda mavjud bo'lmagan belgilarga mos keladi. Masalan, sinf , va dan
[^abc]
tashqari barcha belgilarga mos keladi . Quyidagi misolni ko'rib chiqing: E'tibor bering, mening operatsion tizimimda (Windows) ikkita tirnoq kerak, chunki qobiq ularni qochish belgisi sifatida ko'radi. Ko'rib turganingizdek, bu misolda faqat , va belgilari topildi , ular uchun mosliklar mavjud :
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
Rangli belgilar sinflari
Diapazon belgilari klassi defis (
-
) bilan ajratilgan ikkita belgidan iborat. Defisning chap tomonidagi belgidan boshlab va o'ngdagi belgi bilan tugaydigan barcha belgilar diapazonning bir qismidir. Masalan, diapazon
[a-z]
barcha kichik lotin harflariga mos keladi. Bu oddiy sinfni belgilashga teng
[abcdefghijklmnopqrstuvwxyz]
. Quyidagi misolni ko'rib chiqing: Bu misol faqat mos keladigan
java RegexDemo [a-c] clown
belgiga mos keladi :
c
clown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java tilidagi oddiy iboralar, 2-qism Java tilidagi oddiy iboralar, 3-qism Java tilidagi oddiy iboralar, 4-qism Java tilidagi oddiy ifodalar, 5-qism
Yana nimani o'qish kerak: |
|
GO TO FULL VERSION