Regex API bilan umumiy dasturlash vazifalarini soddalashtiring
Ushbu maqolaning 1 va 2-qismlarida siz oddiy iboralar va Regex API bilan tanishdingiz. Siz sinf haqida bilib oldingizPattern
va oddiy ibora konstruksiyalarini ko‘rsatadigan misollarni ko‘rib chiqdingiz, oddiy satrlar yordamida oddiy naqsh moslashuvidan tortib diapazonlar, chegara moslamalari va miqdoriy ko‘rsatkichlar yordamida murakkabroq moslashtirishgacha. Ushbu va keyingi qismlarda biz birinchi qismda ko'rib chiqilmagan masalalarni ko'rib chiqamiz, sinflarning tegishli usullarini o'rganamiz Pattern
, Matcher
va PatternSyntaxException
. Shuningdek, siz oddiy dasturlash muammolarini osonlashtirish uchun oddiy iboralardan foydalanadigan ikkita yordamchi dasturni o'rganasiz . Birinchisi, hujjatlar uchun koddan sharhlarni chiqaradi. Ikkinchisi - leksik tahlilni amalga oshirish uchun mo'ljallangan qayta foydalanish mumkin bo'lgan kodlar kutubxonasi - assemblerlar, kompilyatorlar va shunga o'xshash dasturlarning muhim komponenti.
MANBA KODI YUKLAB OLISH
Ushbu maqoladagi demo ilovalar uchun barcha manba kodini (JavaWorld uchun Jeff Friesen tomonidan yaratilgan) shu yerdan olishingiz mumkin .Regex API-ni o'rganish
Pattern
, Matcher
va PatternSyntaxException
Regex API ni tashkil etuvchi uchta sinf. Ularning har biri kodingizda muntazam ifodalardan foydalanish imkonini beruvchi usullarni taqdim etadi.
Pattern sinfining usullari
Sinf misoliPattern
kompilyatsiya qilingan muntazam ifoda bo'lib, naqsh deb ham ataladi. Oddiy iboralar naqshlarni moslashtirish operatsiyalari samaradorligini oshirish uchun tuzilgan. Quyidagi statik usullar kompilyatsiyani qo'llab-quvvatlaydi.
Pattern compile(String regex)
kontentniregex
yangi saqlanadigan oraliq vakillikka kompilyatsiya qiladiPattern
. Bu usul muvaffaqiyatli bo'lsa, ob'ektga havolani qaytaradi yokiPatternSyntaxException
noto'g'ri muntazam ifoda sintaksisi aniqlansa, istisno qiladi.Matcher
Ushbu ob'ekt tomonidan ishlatiladigan yoki undan qaytarilgan sinfning har qanday ob'ektiPattern
o'zining standart sozlamalaridan foydalanadi, masalan, katta-kichik harflarni hisobga olgan holda qidirish. Misol tariqasida, kod parchasi nuqta belgisi bilan boshlanadigan satrlarga mos keladigan muntazam ifodaning kompilyatsiya qilingan tasvirini saqlaydiganPattern p = Pattern.compile("(?m)^\\.");
ob'ektni yaratadi .Pattern
Pattern compile(String regex, int flags)
bilan bir xil muammoni hal qiladiPattern compile(String regex)
, lekin hisobga olgan holdaflags
: OR tipidagi bit bayroqlari uchun bit konstantalari to'plami. Sinf bitli OR (masalan, ) yordamida birlashtirilishi va argument sifatida uzatilishi mumkin bo'lganPattern
doimiylarni e'lon qiladi .CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINES
CASE_INSENSITIVE | DOTALL
flags
dan tashqari
CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS
, bu konstantalar 1-qismda ko'rsatilgan ichki bayroq ifodalariga muqobildir. Agar sinfda belgilanganidan boshqa bayroq konstantasi uchrasa Pattern
, usul Pattern compile(String regex, int flags)
istisno qiladi java.lang.IllegalArgumentException
. Masalan, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);
oldingi misolga ekvivalent, doimiy Pattern.MULTILINE
va ichki bayroq ifodasi (?m)
bir xil ishni bajaradi.
Pattern
u foydalanadigan bayroqlar bilan birga olish kerak bo'ladi. Buning uchun siz quyidagi usullarga qo'ng'iroq qilishingiz mumkin:
String pattern()
a ga kompilyatsiya qilingan asl muntazam ifoda qatorini qaytaradiPattern
.int flags()
ob'ektning bayroqlarini qaytaradiPattern
.
Pattern
ob'ektni olish uchun ishlatiladi . Matcher
Usul ob'ekt naqshiga mos keladigan matnni qidiradigan Matcher matcher(Charsequence input)
ob'ektni yaratadi . Chaqirilsa, u ushbu ob'ektga havolani qaytaradi . Masalan, buyruq o'zgaruvchi tomonidan havola qilingan ob'ektni qaytaradi . Matcher
input
Pattern
Matcher
Matcher m = p.matcher(args[1]);
Matcher
Pattern
p
Bir martalik qidiruv |
---|
static boolean matches(String regex, CharSequence input) Sinf usuli shablon yordamida Pattern ob'ektlarni yaratish Pattern va Matcher bir martalik qidirishni tejash imkonini beradi. input Agar naqsh mos bo'lsa , bu usul "true" ni qaytaradi regex , aks holda "false" qiymatini qaytaradi. Agar muntazam ifoda sintaksis xatosi bo'lsa, usul istisno qiladi PatternSyntaxException . Masalan, iborada faqat bo'shliqlar va kichik harflar mavjudligini tasdiqlovchi System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only")); chop etadi . true all lowercase letters and whitespace only |
Matnni ajratish
Ko'pgina ishlab chiquvchilar matnga asoslangan ishchi hisobini maydonlar to'plamiga aylantirish kabi kiritilgan matnni tarkibiy qismlarga ajratish uchun kamida bir marta yozilgan kodga ega. SinfPattern
matnni ajratishning ikkita usulidan foydalangan holda ushbu zerikarli vazifani yanada qulayroq hal qilish imkoniyatini beradi:
-
Usul ob'ekt naqshiga topilgan mosliklarga ko'ra
String[] split(CharSequence text, int limit)
bo'linadi va natijalarni massivda qaytaradi. Har bir massiv elementi keyingi ketma-ketlikdan naqshga mos keladigan matn fragmenti (yoki matn oxiri) bilan ajratilgan matn ketma-ketligini belgilaydi. Massivning elementlari qanday tartibda paydo bo'lsa, xuddi shunday tartibda bo'ladi .text
Pattern
text
Ushbu usulda massiv elementlari soni parametrga bog'liq bo'lib
limit
, u topiladigan mosliklar sonini ham boshqaradi.- Ijobiy qiymat moslikdan ko'p bo'lmagan qiymatlarni qidiradi
limit-1
va massiv uzunligi elementlardan oshmaydilimit
. - Agar qiymat manfiy bo'lsa, barcha mumkin bo'lgan mosliklar qidiriladi va massiv uzunligi ixtiyoriy bo'lishi mumkin.
- Agar qiymat nolga teng bo'lsa, barcha mumkin bo'lgan mosliklar qidiriladi, massiv uzunligi ixtiyoriy bo'lishi mumkin va oxiridagi bo'sh satrlar o'chiriladi.
- Ijobiy qiymat moslikdan ko'p bo'lmagan qiymatlarni qidiradi
- Usul
String[] split(CharSequence text)
chegara argumenti sifatida 0 bilan oldingi usulni chaqiradi va uning chaqiruvi natijasini qaytaradi.
split(CharSequence text)
Xodimlar hisobini ism, yosh, pochta manzili va ish haqi bo'yicha alohida sohalarga bo'lish muammosini hal qilish usulining natijalari quyida keltirilgan :
Pattern p = Pattern.compile(",\\s");
String[] fields = p.split("John Doe, 47, Hillsboro Road, 32000");
for (int i = 0; i < fields.length; i++)
System.out.println(fields[i]);
Yuqoridagi kod vergul belgisidan so'ng darhol bitta bo'sh joy belgisini topish uchun muntazam ifodani tavsiflaydi. Mana uning ijrosi natijalari:
John Doe
47
Hillsboro Road
32000
Shablon predikatlar va Streams API
Java 8 da, sinfdaPattern
usul paydo bo'ldi . Bu usul naqshga mos keladigan predikat (mantiqiy qiymatga ega funktsiya) yaratadi. Ushbu usuldan foydalanish quyidagi kod parchasida ko'rsatilgan: Predicate
asPredicate()
List progLangs = Arrays.asList("apl", "basic", "c", "c++", "c#", "cobol", "java", "javascript", "perl", "python", "scala");
Pattern p = Pattern.compile("^c");
progLangs.stream().filter(p.asPredicate()).forEach(System.out::println);
Ushbu kod dasturlash tili nomlari ro'yxatini yaratadi, so'ngra harf bilan boshlanadigan barcha nomlarni topish uchun naqsh tuzadi c
. Yuqoridagi kodning oxirgi qatori manba sifatida ushbu ro'yxat bilan ketma-ket ma'lumotlar oqimini qabul qilishni amalga oshiradi. U mantiqiy funktsiyadan foydalangan holda filtrni o'rnatadi asPredicate()
, u nom harf bilan boshlanganda rostini qaytaradi c
va oqim bo'ylab takrorlanadi va mos nomlarni standart chiqishga chop etadi. Ushbu oxirgi qator 1-qismdagi RegexDemo ilovasidan tanish bo'lgan quyidagi oddiy tsiklga teng:
for (String progLang: progLangs)
if (p.matcher(progLang).find())
System.out.println(progLang);
Matcher sinf usullari
Sinfning namunasiMatcher
sinfning tuzilgan muntazam ifodasini sharhlash orqali belgilar ketma-ketligida naqshlarni moslashtirish operatsiyalarini bajarish mexanizmini tavsiflaydi Pattern
. Sinf ob'ektlari Matcher
naqshlarni qidirishning har xil turlarini qo'llab-quvvatlaydi:
-
Usul
boolean find()
keyingi moslik uchun kiritilgan matnni qidiradi. Ushbu usul skanerlashni belgilangan matnning boshida yoki oldingi moslikdan keyingi birinchi belgidan boshlaydi. Ikkinchi variant, agar ushbu usulga oldingi qo'ng'iroq haqiqiy bo'lsa va hal qiluvchi qayta o'rnatilmagan bo'lsa, mumkin. Har qanday holatda, agar qidiruv muvaffaqiyatli bo'lsa, mantiqiy qiymat true qaytariladi. Ushbu usulning namunasiniRegexDemo
1-qismda topish mumkin. -
Usul
boolean find(int start)
mos keluvchini qayta o'rnatadi va keyingi mos keladigan matnni qidiradi. Ko'rish parametr bilan belgilangan joydan boshlanadistart
. Qidiruv muvaffaqiyatli bo'lsa, mantiqiy qiymat true qaytariladi. Masalan,m.find(1);
matnni pozitsiyadan boshlab skanerlaydi1
(0 pozitsiyasi e'tiborga olinmaydi). Agar parametrdastart
manfiy qiymat yoki mos keluvchi matn uzunligidan kattaroq qiymat bo'lsa, usul istisno qiladijava.lang.IndexOutOfBoundsException
. -
Usul
boolean matches()
barcha matnni naqshga moslashtirishga harakat qiladi. Agar barcha matn naqshga mos kelsa, u mantiqiy qiymatni qaytaradi. Misol uchun, kod so'z belgisi emasligi sababliPattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());
chiqadi .false
!
-
Usul
boolean lookingAt()
belgilangan matnni naqsh bilan moslashtirishga harakat qiladi. Agar matnning biron bir qismi naqshga mos kelsa, bu usul true qiymatini qaytaradi. Usuldan farqli o'laroqmatches();
, barcha matnlar naqshga mos kelishi shart emas. Masalan,Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());
u chiqaditrue
, chunki matn boshidaabc!
faqat so'z yasovchi belgilar mavjud.
Pattern
, sinf ob'ektlari Matcher
holat ma'lumotlarini saqlaydi. Ba'zan naqsh qidirish tugagandan so'ng ushbu ma'lumotni o'chirish uchun moslashtiruvchini qayta o'rnatishingiz kerak bo'lishi mumkin. Resolverni qayta tiklash uchun quyidagi usullar mavjud:
-
Usul
Matcher reset()
mos keluvchining holatini, shu jumladan oxiriga qo'shilishi kerak bo'lgan pozitsiyani tiklaydi (0 ga qayta o'rnatiladi). Keyingi naqsh qidirish operatsiyasi mos keluvchi matnning boshidan boshlanadi. Joriy ob'ektga havolani qaytaradiMatcher
. Masalan,m.reset();
tomonidan havola qilingan rezolyutsiyani tiklaydim
. -
Usul
Matcher reset(CharSequence text)
hal qiluvchi holatini tiklaydi va yangi yechim matnini ga o'rnataditext
. Keyingi naqsh qidirish operatsiyasi yangi mos keluvchi matn boshida boshlanadi. Joriy ob'ektga havolani qaytaradiMatcher
. Misol uchun,m.reset("new text");
havola qilingan hal qiluvchini qayta o'rnatadim
va yangi rezolyutsiya matnini ga o'rnatadi"new text"
.
Oxiriga matn qo'shish
Oxiriga qo'shiladigan moslashtiruvchining pozitsiyasi turdagi ob'ektning oxiriga qo'shiladigan moslashtiruvchi matnning boshlanishini bildiradijava.lang.StringBuffer
. Quyidagi usullar ushbu pozitsiyadan foydalanadi:
-
Usul mos keluvchi matn belgilarini o'qiydi va ularni argument tomonidan havola qilingan
Matcher appendReplacement(StringBuffer sb, String replacement)
ob'ektning oxiriga qo'shadi . Ushbu usul oldingi naqsh mosligidan oldingi oxirgi belgida o'qishni to'xtatadi. Keyinchalik, usul argument tomonidan havola qilingan turdagi ob'ektdan belgilarni ob'ekt oxiriga qo'shadi (satr oldingi qidiruv paytida olingan matn ketma-ketligiga havolalarni o'z ichiga olishi mumkin; ular olingan belgilar va guruh raqamlari yordamida ko'rsatilgan ). Nihoyat, usul so'nggi mos keladigan belgining pozitsiyasiga qo'shiladigan mos keluvchi pozitsiyasining qiymatini o'rnatadi va keyin joriy moslashtiruvchiga havolani qaytaradi.StringBuffer
sb
String
replacement
StringBuffer
replacement
($)
-
Usul
StringBuffer appendTail(StringBuffer sb)
ob'ektga barcha matnni qo'shadiStringBuffer
va ushbu ob'ektga havolani qaytaradi. Oxirgi usul chaqiruvidan so'ng , qolgan matnni ob'ektga nusxalash uchunappendReplacement(StringBuffer sb, String replacement)
usulni chaqiring .appendTail(StringBuffer sb)
StringBuffer
Agar mos keluvchi moslikni hali topmagan bo'lsa yoki oldingi qidiruv urinishi muvaffaqiyatsiz bo'lsa, usul Matcher appendReplacement(StringBuffer sb, String replacement)
istisno qiladi . Agar chiziq naqshda bo'lmagan suratga olish guruhini ko'rsatsa, java.lang.IllegalStateException
u istisno qiladi ).IndexOutOfBoundsException
replacement
Qo'lga olingan guruhlar |
---|
1-qismdan eslaganingizdek, suratga olish guruhi qavslar ( () ) meta-belgilari ichiga olingan belgilar ketma-ketligidir. Ushbu konstruksiyaning maqsadi topilgan belgilarni keyinchalik namunalarni moslashtirish vaqtida qayta ishlatish uchun saqlashdir. Qo'lga olingan guruhdagi barcha belgilar naqshni qidirishda bir butun sifatida ko'rib chiqiladi. |
appendReplacement(StringBuffer sb, String replacement)
va usullarini chaqiradi : appendTail(StringBuffer sb
cat
caterpillar
Pattern p = Pattern.compile("(cat)");
Matcher m = p.matcher("one cat, two cats, or three cats on a fence");
StringBuffer sb = new StringBuffer();
while (m.find())
m.appendReplacement(sb, "$1erpillar");
m.appendTail(sb);
System.out.println(sb);
O'zgartirilgan matnda qo'lga kiritilgan guruh va unga havoladan foydalanish dasturga erpillar
har bir sodir bo'lgandan keyin kiritish kerakligini aytadi cat
. Ushbu kodni bajarish natijasi quyidagicha ko'rinadi: one caterpillar, two caterpillars, or three caterpillars on a fence
Matnni almashtirish
SinfMatcher
bizga matnni almashtirishning ikkita usulini taqdim etadi appendReplacement(StringBuffer sb, String replacement)
. Ushbu usullardan foydalanib, siz [almashtirilgan matn] birinchi marta yoki barcha hodisalarni almashtirishingiz mumkin:
-
Usul
String replaceFirst(String replacement)
moslashtiruvchini qayta o'rnatadi, yangi ob'ekt yaratadiString
, mos keluvchi matnning barcha belgilarini (birinchi o'yingacha) ushbu satrga ko'chiradi, belgilarni oxirigacha qo'shadireplacement
, qolgan belgilarni satrga ko'chiradi va ob'ektString
(satrdareplacement
dollar belgilari va olingan guruh raqamlari yordamida oldingi qidiruv matn ketma-ketligida olinganlarga havolalar bo'lishi mumkin). -
Usul
String replaceAll(String replacement)
usulga o'xshash ishlaydiString replaceFirst(String replacement)
, lekinreplacement
barcha topilgan mosliklarni satrdagi belgilar bilan almashtiradi.
\s+
kiritilgan matnda bir yoki bir nechta bo'shliq belgilarini qidiradi. Quyida biz ushbu oddiy ifodadan foydalanamiz va replaceAll(String replacement)
takroriy bo'shliqlarni olib tashlash usulini chaqiramiz:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем \t\t лишние пробелы. ");
System.out.println(m.replaceAll(" "));
Natijalar: Удаляем лишние пробелы.
Java tilidagi oddiy iboralar, 4-qism Java tilidagi oddiy ifodalar, 5-qism
GO TO FULL VERSION