Назарларыңызға
JavaWorld веб-сайты үшін Джефф Фризен жазған Java тіліндегі тұрақты өрнектерге арналған қысқаша нұсқаулықтың аудармасын ұсынамыз . Оқуға ыңғайлы болу үшін мақаланы бірнеше бөлікке бөлдік.
Үлгілерді тану және сипаттау үшін Java бағдарламаларында Regular Expression API пайдалану
Java таңбасы және әртүрлі жол деректер түрлері үлгіні сәйкестендіру үшін төмен деңгейдегі қолдауды қамтамасыз етеді, бірақ оларды осы мақсатта пайдалану әдетте codeтың айтарлықтай күрделілігін қосады. Қарапайым және тиімдірек code Regex API («Regular Expression API») арқылы алынады. Бұл оқулық тұрақты өрнектермен және Regex API интерфейсімен жұмысты бастауға көмектеседі. Біз алдымен пакеттегі ең қызықты үш сыныпты талқылаймыз
java.util.regex
, содан кейін сыныптың ішіне қарап
Pattern
, оның күрделі үлгіге сәйкес конструкцияларын зерттейміз.
Назар аударыңыз: Демо-қосымшаның бастапқы codeын (JavaWorld сайты үшін Джефф Фризен жасаған) осы мақаладан
осы жерден жүктеп алуға болады .
Тұрақты тіркестер дегеніміз не?
Тұрақты өрнек (тұрақты өрнек/regex/regexp) белгілі бір жолдар жинағын сипаттайтын үлгі болып табылатын жол болып табылады. Үлгі қандай жолдар жиынға жататынын анықтайды. Үлгі литералдар мен метатаңбалардан — тура мағынадан гөрі ерекше мағынаға ие таңбалардан тұрады. Үлгіні сәйкестендіру – сәйкестіктерді, яғни тұрақты өрнек үлгісіне сәйкес келетін жолдарды табу үшін мәтінді іздеу. Java өзінің Regex API арқылы үлгі сәйкестігін қолдайды. Бұл API үш сыныптан тұрады:
Pattern
,
Matcher
және
PatternSyntaxException
, бумада орналасқан
java.util.regex
:
- Үлгілер деп те аталатын сынып нысандары
Pattern
тұрақты өрнектер болып табылады.
- сынып an objectілері
Matcher
немесе сәйкестіктер таңбалар тізбегіндегі сәйкестіктерді табуға арналған үлгіні түсіндіру механизмдері болып табылады (сыныптары интерфейсті жүзеге асыратын java.lang.CharSequence
және мәтін көзі ретінде қызмет ететін нысандар).
- Сынып нысандары
PatternSyntaxException
жарамсыз тұрақты өрнек үлгілерін сипаттау үшін пайдаланылады.
Java сонымен қатар әртүрлі әдістер арқылы үлгіні сәйкестендіруге қолдау көрсетеді
java.lang.String
. Мысалы, функция шақырушы жол тұрақты өрнекке дәл сәйкес келсе ғана
boolean matches (String regex)
қайтарады .
true
regex
Ыңғайлы әдістер |
matches() және класстың басқа тұрақты өрнекке бағытталған ыңғайлылық әдістері String Regex API-ге ұқсас түрде капот астында жүзеге асырылады. |
RegexDemo
Мен Java тұрақты өрнектерін және , және
RegexDemo
әртүрлі әдістерін көрсету үшін қолданба жасадым . Төменде осы демонстрациялық қолданбаның бастапқы codeы берілген. Листинг 1. Тұрақты өрнекті көрсету
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
Класс әдісі жасайтын бірінші нәрсе
RegexDemo
- оның пәрмен жолын тексеру. Ол екі аргументті қажет етеді: біріншісі - тұрақты өрнек, екіншісі - тұрақты өрнек ізделетін кіріс мәтіні. Енгізілген мәтін ішінде жаңа жол таңбасын пайдалану қажет болуы мүмкін
(\n)
.
\
Мұны тек таңбадан кейін таңбаны көрсету арқылы жасауға болады
n
. Функция
main()
осы таңбалар тізбегін Юниcode мәніне 10 түрлендіреді.
Кодтың негізгі
RegexDemo
бөлігі
try-catch
. Блок
try
алдымен берілген тұрақты өрнекті және енгізу мәтінін шығарады, содан кейін құрастырылған тұрақты өрнекті сақтайтын нысанды жасайды
Pattern
(үлгіні сәйкестендіру өнімділігін жақсарту үшін тұрақты өрнектер құрастырылады). Сәйкестік нысаннан шығарылады
Pattern
және барлығы табылғанша сәйкестіктерді итеративті түрде іздеу үшін пайдаланылады. Блок ерекше жағдай туралы пайдалы ақпаратты алу үшін
catch
бірнеше сынып әдістерін шақырады .
PatternSyntaxException
Бұл ақпарат шығыс ағынына дәйекті түрде шығарылады. Кодтың қалай жұмыс істейтіні туралы егжей-тегжейлерді білудің қажеті жоқ: олар API-ны мақаланың екінші бөлігінде зерттеген кезде анық болады. Дегенмен, 1-тізімді құрастыру керек. 1-тізімнен codeты алып, компиляциялау үшін пәрмен жолына келесі пәрменді теріңіз
RegexDemo
:
javac RegexDemo.java
Pattern класы және оның конструкциялары
Pattern
Regex API құрайтын үш сыныптың біріншісі класс тұрақты өрнектің құрастырылған көрінісі болып табылады. Сынып SDK құжаттамасы
Pattern
әртүрлі тұрақты өрнек конструкцияларын сипаттайды, бірақ тұрақты өрнектерді белсенді түрде пайдаланбасаңыз, бұл құжаттаманың бөліктері шатасуы мүмкін. Кванторлар дегеніміз не және сараң, құлықсыз және иелік сандық анықтауыштардың айырмашылығы неде? Таңба кластары, шекара сәйкестіктері, кері сілтемелер және енгізілген жалауша өрнектері дегеніміз не? Осы және басқа сұрақтарға келесі бөлімдерде жауап беремін.
Әріптік жолдар
Ең қарапайым тұрақты өрнек конструкциясы әріптік жол болып табылады. Үлгіні сәйкестендіру сәтті болуы үшін кіріс мәтінінің кейбір бөлігі сол құрылымның үлгісіне сәйкес келуі керек. Келесі мысалды қарастырыңыз: Бұл мысалда біз енгізу мәтініндегі
java RegexDemo apple applet
үлгіге сәйкестік табуға тырысамыз . Келесі нәтиже табылған сәйкестікті көрсетеді:
apple
applet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Біз шығыста тұрақты өрнек пен кіріс мәтінін көреміз, содан кейін
apple
апплеттегі сәтті анықтау көрсеткішін көреміз. Сонымен қатар, осы матчтың бастапқы және соңғы позициялары берілген:
0
және
4
сәйкесінше. Бастапқы позиция мәтіндегі сәйкестік табылған бірінші орынды, ал соңғы позиция сәйкестіктің соңғы нүктесін көрсетеді. Енді біз келесі пәрмен жолын бердік делік:
java RegexDemo apple crabapple
Бұл жолы әртүрлі бастапқы және аяқталу орындарымен келесі нәтижені аламыз:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Әйтпесе, кіріс мәтіні
applet
тұрақты өрнекпен және ретінде
apple
, сәйкестік табылмайды. Бүкіл тұрақты өрнек сәйкес келуі керек, бірақ бұл жағдайда кіріс мәтінінде -ден
t
кейін болмайды
apple
.
Метатаңбалар
Неғұрлым қызықты тұрақты өрнек конструкциялары әріптік таңбаларды метатаңбалармен біріктіреді. Мысалы, тұрақты өрнекте
a.b
нүкте метатаңбасы және b
(.)
арасындағы кез келген таңбаны білдіреді
a
. Келесі мысалды қарастырыңыз:
java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
Бұл мысал
.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
Шығаруда біз екі сәйкестікті көреміз:
fox
және
ox
(оның алдында бос орын белгісі бар). Метатаңба бірінші жағдайда
.
таңбаға
f
, екіншісінде бос орынға сәйкес келеді.
.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
Цитата метатаңбалары |
Тұрақты өрнек құрылымында әріптік таңба ретінде немесе кез келген басқа метатаңбаны көрсету үшін . келесі жолдардың бірімен одан құтылу керек:
- оның алдына кері қиғаш сызық белгісін қойыңыз;
- Бұл метатаңбаны
\Q және арасына қойыңыз \E (мысалы, \Q.\E ).
Кері қиғаш сызықтар сияқты жолдың литералында пайда болатын кез келген таңбаларды көшіруді ұмытпаңыз String regex = "\\."; (мысалы, \\. немесе \\Q.\\E ). Пәрмен жолы аргументінің бөлігі болып табылатын кері қиғаш сызықтарды көшірмеңіз. |
Кейіпкерлер кластары
Кейде сіз іздеген сәйкестіктерді белгілі бір таңбалар жиынтығымен шектеуіңіз керек. Мысалы, мәтіннен
a
,
e
, және
i
, дауысты дыбыстарды іздеңіз , дауысты әріптің әрбір кездесуі сәйкестік деп саналады. Мұндай есептерді шешуде бізге тік жақшаның ( ) метатаңбалары арасындағы таңбалар жиынын анықтайтын таңбалар кластары көмектеседі . Класс қарапайым таңба сыныптарын, ауқым сыныптарын, кері, біріктіру, қиылысу және алу класстарын қолдайды. Біз қазір олардың барлығын қарастырамыз.
o
u
[ ]
Pattern
Қарапайым кейіпкерлер кластары
Қарапайым таңбалар класы қатар орналасқан таңбалардан тұрады және тек сол таңбаларға сәйкес келеді. Мысалы, сынып , және
[abc]
таңбаларына сәйкес келеді . Келесі мысалды қарастырыңыз: Нәтижелерден көріп отырғаныңыздай, бұл мысалда тек сәйкестік бар таңба :
a
b
c
java RegexDemo [csw] cave
c
cave
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0
Төңкерілген кейіпкерлер кластары
Төңкерілген таңбалар класы метатаңбадан басталады
^
және онда қамтылмаған таңбаларға ғана сәйкес келеді. Мысалы, сынып , және қоспағанда
[^abc]
барлық таңбаларға сәйкес келеді . Келесі мысалды қарастырыңыз: Менің операциялық жүйемде (Windows) қос тырнақшалар қажет екенін ескеріңіз, себебі қабық оларды шығу таңбасы ретінде қарастырады. Көріп отырғаныңыздай, бұл мысалда тек және таңбалары табылды , олар үшін сәйкестіктер бар :
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
Ауқымды таңбалар кластары
Ауқым таңбалар класы сызықша (
-
) арқылы бөлінген екі таңбадан тұрады. Дефистің сол жағындағы таңбадан басталып, оң жағындағы таңбамен аяқталатын барлық таңбалар ауқымның бөлігі болып табылады. Мысалы, ауқым
[a-z]
барлық кіші латын әріптеріне сәйкес келеді. Бұл қарапайым классты анықтауға тең
[abcdefghijklmnopqrstuvwxyz]
. Келесі мысалды қарастырыңыз: Бұл мысал тек ішінде сәйкес келетін
java RegexDemo [a-c] clown
таңбаға сәйкес келеді :
c
clown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java тіліндегі тұрақты өрнектер, 2 бөлім Java тіліндегі тұрақты өрнектер, 3 бөлім Java тіліндегі тұрақты өрнектер, 4 бөлім Java тіліндегі тұрақты өрнектер, 5 бөлім
GO TO FULL VERSION