Сіздердің назарларыңызға Джефф Фризеннің javaworld веб-сайты үшін жазған Java тіліндегі тұрақты өрнектерге арналған қысқаша нұсқаулықтың аудармасын ұсынамыз . Оқуға ыңғайлы болу үшін мақаланы бірнеше бөлікке бөлдік.
Java тіліндегі тұрақты өрнектер, 1 бөлім
Бірнеше ауқымды біріктіру |
Бірнеше ауқымдарды қатар қою арқылы бір ауқым таңбалар класына біріктіруге болады. Мысалы, сынып [a-zA-Z] кіші немесе үлкен регистрдегі латын әліпбиінің барлық таңбаларына сәйкес келеді. |
Бірнеше ауқымды біріктіру
Бірнеше ауқымдарды қатар қою арқылы бір ауқым таңбалар класына біріктіруге болады. Мысалы, сынып
[a-zA-Z]
кіші немесе үлкен регистрдегі латын әліпбиінің барлық таңбаларына сәйкес келеді.
Кейіпкерлер кластарын біріктіру
Таңбалар класының бірлестігі бірнеше кірістірілген таңба сыныптарынан тұрады және нәтижелік бірлестіктегі барлық таңбаларға сәйкес келеді. Мысалы, сынып -дан -ге және -ге дейінгі
[a-d[m-p]]
таңбаларды сәйкестендіреді . Келесі мысалды қарастырыңыз: Бұл мысалда сәйкестіктері бар , , , және таңбалары болады :
a
d
m
p
java RegexDemo [ab[c-e]] abcdef
a
b
c
d
e
abcdef
regex = [ab[c-e]]
input = abcdef
Found [a] starting at 0 and ending at 0
Found [b] starting at 1 and ending at 1
Found [c] starting at 2 and ending at 2
Found [d] starting at 3 and ending at 3
Found [e] starting at 4 and ending at 4
Таңбалар класының қиылысы
Таңбалар кластарының қиылысы барлық кірістірілген сыныптарға ортақ таңбалардан тұрады және тек жалпы таңбаларға сәйкес келеді. Мысалы, сынып , және
[a-z&&[d-f]]
таңбаларына сәйкес келеді . Келесі мысалды қарастырыңыз: Менің Windows операциялық жүйемде қос тырнақшалар қажет екенін ескеріңіз, себебі пәрмен қабығы оларды пәрмен бөлгіші ретінде қарастырады. Бұл мысал тек келесіге сәйкес келетін таңбаны табады :
d
e
f
java RegexDemo "[aeiouy&&[y]]" party
&
y
party
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4
Таңбалар кластарын азайту
Шығарылатын таңба сыныптары кірістірілген таңбалар сыныптарында қамтылғандардан басқа барлық таңбалардан тұрады және тек қалған таңбаларға сәйкес келеді. Мысалы, сынып
[a-z&&[^m-p]]
таңбаларды -дан
a
және
l
-ге
q
дейін сәйкестендіреді
z
: Бұл мысалда сәйкестіктері бар
java RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefg
таңбаларды табады :
d
f
abcdefg
regex = [a-f&&[^a-c]&&[^e]]
input = abcdefg
Found [d] starting at 3 and ending at 3
Found [f] starting at 5 and ending at 5
Алдын ала анықталған таңбалар кластары
Кейбір таңба сыныптары стенографиялық белгілерді қолдануды негіздеу үшін
тұрақты өрнектерде жеткілікті жиі пайда болады. Класс
Pattern
осындай қысқартулар сияқты алдын ала анықталған таңба сыныптарын ұсынады. Оларды тұрақты өрнектерді жеңілдету және синтаксистік қателерді азайту үшін пайдалануға болады. Алдын ала анықталған таңба сыныптарының бірнеше санаты бар: стандартты, POSIX
java.lang.Character
және сценарий, блок, санат және екілік сияқты Юниcode сипаттары. Келесі тізім тек стандартты сыныптар санатын көрсетеді:
\d
: Сан. Эквивалент [0-9]
.
\D
: Сандық емес таңба. Эквивалент [^0-9]
.
\s
: Бос орын таңбасы. Эквивалент [ \t\n\x0B\f\r]
.
\S
: Бос орын таңбасы емес. Эквивалент [^\s]
.
\w
: Сөзжасамдық таңба. Эквивалент [a-zA-Z_0-9]
.
\W
: Сөзжасамдық таңба емес. Эквивалент [^\w]
.
Келесі мысалда
\w
кіріс мәтініндегі барлық сөз таңбаларын сипаттау үшін алдын ала анықталған таңбалар сыныбы қолданылады:
java RegexDemo \w "aZ.8 _"
Кезең және бос орын таңбалары сөз таңбалары болып саналмайтынын көрсететін келесі орындау нәтижелерін мұқият қараңыз:
regex = \w
input = aZ.8 _
Found [a] starting at 0 and ending at 0
Found [Z] starting at 1 and ending at 1
Found [8] starting at 3 and ending at 3
Found [_] starting at 5 and ending at 5
Жолды бөлгіштер |
Сыныптың SDK құжаттамасы Pattern нүкте метатаңбасын жолды бөлгіштерден басқа кез келген таңбаға сәйкес келетін алдын ала анықталған таңбалар класы ретінде сипаттайды (жолдың соңын белгілейтін бір немесе екі таңбалы тізбектер). Ерекшелік - нүктелер режимі (оны кейін талқылаймыз), онда нүктелер де сызық бөлгіштеріне сәйкес келеді. Класс Pattern келесі жолды бөлгіштерді ажыратады:
- каретканы қайтару таңбасы (
\r );
- жаңа жол таңбасы (қағазды бір жолға жылжыту белгісі) (
\n );
- каретканы қайтару таңбасы бірден жаңа жол таңбасы (
\r\n );
- келесі жол таңбасы (
\u0085 );
- жолды бөлгіш таңбасы (
\u2028 );
- абзацты бөлу белгісі (
\u2029 )
|
Түсірілген топтар
Түсіру тобы үлгі бойынша іздеу кезінде әрі қарай пайдалану үшін табылған таңбалар жинағын сақтау үшін пайдаланылады. Бұл конструкция метатаңбаларға жақша ( ) арқылы алынған таңбалар тізбегі болып табылады
( )
. Үлгі бойынша іздеу кезінде түсірілген топтағы барлық таңбалар бір бүтін ретінде қарастырылады. Мысалы, түсіру тобы ( ) , және
Java
әріптерін бір бірлікке біріктіреді. Бұл түсіру тобы кіріс мәтініндегі үлгінің барлық көріністерін табады . Әрбір сәйкестікте алдыңғы сақталған таңбалар келесілерімен ауыстырылады. Түсірілген топтар басқа түсірілген топтардың ішіне кірістірілуі мүмкін. Мысалы, тұрақты өрнекте топ топ ішінде кірістірілген . Әрбір кірістірілген немесе кірістірілмеген түсіру тобына 1-ден басталатын нөмір тағайындалады және нөмірлеу солдан оңға қарай жүреді. Алдыңғы мысалда сәйкестіктер түсіру тобының нөмірі 1 және түсіру тобының нөмірі 2 сәйкес келеді . Тұрақты өрнекте түсіру тобының нөмірі 1 және түсіру тобының нөмірі 2 сәйкес келеді . Түсіру топтары сақтаған сәйкестіктерге кейінірек кері сілтемелер арқылы қол жеткізуге болады. Түсірілетін топтың нөміріне сәйкес келетін сандық таңбадан кейін кері қиғаш сызық таңбасы ретінде көрсетілген кері сілтеме топпен түсірілген мәтіндегі таңбаларға сілтеме жасауға мүмкіндік береді. Кері сілтеменің болуы сәйкестікті ондағы нөмірге негізделген түсірілген топтың сақталған іздеу нәтижесіне сілтеме жасайды, содан кейін одан әрі іздеу әрекеті үшін осы нәтижедегі таңбаларды пайдаланады. Келесі мысал мәтіндегі грамматикалық қателерді табу үшін кері сілтемені пайдалануды көрсетеді: Бұл мысал кіріс мәтінінде бірден кейін келетін қайталанатын сөзбен грамматикалық қатені табу үшін тұрақты өрнекті пайдаланады . Бұл тұрақты өрнек түсіру үшін екі топты көрсетеді: 1 саны – , сәйкес келетін және бос орын таңбасына сәйкес келетін саны 2 – . Артқы сілтеме №2 топтың сақталған нәтижесін қайта қарауға мүмкіндік береді, осылайша сәйкестікші бос орынның екінші рет қайталануын іздей алады , содан кейін бос орын бірінші пайда болғаннан кейін бірден және . Матчтың нәтижелері келесідей:
J
a
v
a
Java
Java
(Java( language))
(language)
(Java)
(Java( language))
(language)
(a)(b)
(a)
(b)
java RegexDemo "(Java( language)\2)" "The Java language language"
(Java( language)\2)
language
Java
"The Java language language"
(Java( language)\2)
Java language language
(language)
language
\2
language
language
RegexDemo
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25
Шекаралық сәйкестіктер
Кейде үлгі сәйкестігін жолдың басында, сөз шекараларында, мәтіннің соңында және т.б. орындау керек.
Pattern
Мұны келесі орындарда сәйкестіктерді іздейтін тұрақты өрнек конструкциялары болып табылатын сыныптың жиегі сәйкестіктерінің бірін пайдалану арқылы жасауға болады :
^
: жолдың басы;
$
: Жолдың соңы;
\b
: Сөз шекарасы;
\B
: псевдосөз шекарасы;
\A
: мәтіннің басы;
\G
: Алдыңғы матчтың соңы;
\Z
: Мәтіннің соңы, кейінгі жолды бөлгішті қоспағанда (бар болса);
\z
: Мәтін соңы
Келесі мысал нөл немесе одан да көп сөз таңбаларымен
^
басталатын жолдарды табу үшін шекаралық сәйкестендіруші метатаңбасын пайдаланады: Таңба кіріс мәтінінің алғашқы үш таңбасының бірізді үлгі таңбаларына сәйкес келуі керектігін және кез келген санмен жалғасуы мүмкін екенін көрсетеді . сөзжасамдық белгілер. Міне, орындалу нәтижесі:
The
java RegexDemo "^The\w*" Therefore
^
T
h
e
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
Пәрмен жолын өзгертсеңіз не болады
java RegexDemo "^The\w*" " Therefore"
?
Therefore
Енгізілген мәтіннің алдында бос орын таңбасы болғандықтан сәйкестік табылмайды .
Нөлдік ұзындық сәйкес келеді
Кейде жиек сәйкестіктерімен жұмыс істегенде, ұзындығы нөлдік сәйкестіктерді кездестіресіз.
Совпадение нулевой длины
құрамында ешқандай таңба жоқ сәйкестік. Олар бос енгізілген мәтінде, енгізілетін мәтіннің басында, кіріс мәтінінің соңғы символынан кейін және кіріс мәтінінің кез келген екі таңбасының арасында болуы мүмкін. Ұзындығы нөлдік сәйкестіктерді тану оңай, себебі олар әрқашан бір қалыпта басталып, аяқталады. Келесі мысалды қарастырыңыз:
java RegExDemo \b\b "Java is"
Бұл мысал екі дәйекті сөз шекарасын іздейді және нәтижелер келесідей болады:
regex = \b\b
input = Java is
Found [] starting at 0 and ending at -1
Found [] starting at 4 and ending at 3
Found [] starting at 5 and ending at 4
Found [] starting at 7 and ending at 6
Нәтижелерде біз бірнеше нөлдік матчтарды көреміз. Мұндағы соңғы позициялар бастапқы позициялардан бір кем, себебі
RegexDemo
мен 1-тізімде бастапқы codeта көрсеткенмін
end() – 1
.
Кванторлар
Квантор - үлгіні сандық мәнмен анық немесе жанама түрде байланыстыратын тұрақты өрнек конструкциясы. Бұл сандық мән үлгіні қанша рет іздеу керектігін анықтайды. Кванторлар сараң, жалқау және аса сараң болып бөлінеді:
- Ашкөз квантор (
?
, *
немесе +
) ең ұзын сәйкестікті табуға арналған. Сұрасам бола ма X
? бір немесе одан да көп оқиғаларды табу X
, X*
нөлдік немесе бірнеше көріністерді табу X
, X+
бір немесе бірнеше оқиғаларды табу X
, оқиғаларды X{n}
табу , кем дегенде (және одан да көп) оқиғаларды табу және кем дегенде , бірақ көп емес оқиғаларды табу .n
X
X{n,}
n
X
X{n,m}
n
m
X
- Жалқау кванфикатор (
??
, *?
немесе +?
) ең қысқа сәйкестікті табуға арналған. , ? X??
бір немесе бірнеше көріністерін іздеуді белгілей аласыз ? нөлдік немесе бірнеше оқиғаларды табу , бір немесе бірнеше көріністерді табу , оқиғаларды табу , кем дегенде (және одан да көп) оқиғаларды табу , және кем дегенде, бірақ көп емес оқиғаларды табу .X
X*
X
X+?
X
X{n}?
n
X
X{n,}?
n
X
X{n,m}?
n
m
X
- Аса ашкөз кванфикатор (
?+
, *+
немесе ++
) ашкөз кванторға ұқсас, тек аса ашкөз квантор ең ұзын сәйкестікті табуға бір ғана әрекет жасайды, ал ашкөз квантор бірнеше әрекет жасай алады. X?+
Бір немесе одан да көп оқиғаларды табу үшін X
, X*+
нөлдік немесе бірнеше оқиғаларды табу үшін X
, X++
бір немесе бірнеше оқиғаларды табу үшін X
, оқиғаларды X{n}+
табу үшін , кем дегенде (және одан да көп) оқиғаларды табу үшін және кем дегенде , бірақ көп емес оқиғаларды табу үшін орнатуға болады . .n
X
X{n,}+
n
X
X{n,m}+
n
m
X
Келесі мысал ашкөз кванфикатордың қолданылуын көрсетеді:
java RegexDemo .*ox "fox box pox"
Міне нәтижелер:
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
Ашкөз квантор (
.*
) -мен аяқталатын таңбалардың ең ұзын тізбегін табады
ox
. Ол бүкіл енгізілген мәтінді тұтынады, содан кейін кіріс мәтінінің осы таңбалармен аяқталатынын анықтағанша кері оралады. Енді жалқау кванторды қарастырайық:
java RegexDemo .*?ox "fox box pox"
Оның нәтижелері:
regex = .*?ox
input = fox box pox
Found [fox] starting at 0 and ending at 2
Found [ box] starting at 3 and ending at 6
Found [ pox] starting at 7 and ending at 10
Жалқау квантор (
.*?
) -мен аяқталатын таңбалардың ең қысқа тізбегін табады
ox
. Ол бос жолдан басталады және сәйкестікті тапқанша бірте-бірте таңбаларды тұтынады. Содан кейін кіріс мәтіні таусылғанша жұмысын жалғастырады. Соңында, өте ашкөз кванторды қарастырайық:
java RegexDemo .*+ox "fox box pox"
Міне, оның нәтижелері:
regex = .*+ox
input = fox box pox
Өте ашкөз кванфикатор ( ) сәйкестіктерді таппайды, себебі ол барлық кіріс мәтінін тұтынады және тұрақты өрнектің соңында
.*+
сәйкес келетін ештеңе қалмайды .
ox
Ашкөз кванфикатордан айырмашылығы, өте ашкөз квантор кері айналдырмайды.
Нөлдік ұзындық сәйкес келеді
Кейде кванторлармен жұмыс істегенде нөлдік ұзындықтағы сәйкестіктерді кездестіресіз. Мысалы, келесі сараң кванфикаторды пайдалану бірнеше нөлдік ұзындықтағы сәйкестіктерге әкеледі:
java RegexDemo a? abaa
Осы мысалды іске қосу нәтижелері:
regex = a?
input = abaa
Found [a] starting at 0 and ending at 0
Found [] starting at 1 and ending at 0
Found [a] starting at 2 and ending at 2
Found [a] starting at 3 and ending at 3
Found [] starting at 4 and ending at 3
Орындау нәтижелерінде бес сәйкестік бар.
a
Бірінші, үшінші және төртінші өте күтілетін болса да (олар үш әріптің позицияларына сәйкес келеді
abaa
), екінші және бесінші сізді таң қалдыруы мүмкін. Олар мәтіннің соңына не
a
сәйкес келетінін көрсететін сияқты , бірақ іс жүзінде олай емес.
b
Тұрақты сөз тіркесі мәтіннің соңында
a?
іздемейді .
b
Ол бар немесе жоқты іздейді
a
.
a?
Ол табылмаса ,
a
ол оны нөлдік ұзындық сәйкестік ретінде хабарлайды.
Кірістірілген жалауша өрнектері
Сәйкестендірушілер қалыпты өрнекті үлгіге құрастырған кезде қайта анықталатын кейбір әдепкі жорамалдарды жасайды. Бұл мәселені кейінірек талқылаймыз. Тұрақты өрнек кірістірілген жалауша өрнегін пайдаланып әдепкі мәндердің кез келгенін қайта анықтауға мүмкіндік береді. Бұл тұрақты өрнек конструкциясы сұрақ белгісі метатаңбасының (
?
) айналасындағы жақшаның метатаңбасы ретінде көрсетіледі, одан кейін кіші латын әрпі бар. Сынып
Pattern
келесі кірістірілген жалауша өрнектерді түсінеді:
(?i)
: Регистрді ескермейтін үлгі сәйкестігін қосады. Мысалы, пәрменді пайдалану кезінде java RegexDemo (?i)tree Treehouse
таңбалар тізбегі Tree
үлгіге сәйкес келеді tree
. Әдепкі - регистрді ескеретін үлгі іздеу.
(?x)
: Үлгі ішіндегі метатаңбадан басталатын бос орын таңбаларын және түсініктемелерді пайдалануға рұқсат береді #
. Сәйкестендіруші екеуін де елемейді. Мысалы, java RegexDemo ".at(?x)#match hat, cat, and so on" matter
таңбалар тізбегі үшін mat
үлгі сәйкес келеді .at
. Әдепкі бойынша, бос орын таңбалары мен түсініктемелерге рұқсат етілмейді және сәйкестендіруші оларды іздеуге қатысатын таңбалар ретінде қарастырады.
(?s)
: нүкте метатаңбасы кез келген басқа таңбаға қосымша сызық бөлгіштеріне сәйкес келетін нүктелік режимді қосады. Мысалы, пәрмен java RegexDemo (?s). \n
жаңа жол таңбасын табады. Әдепкі мәні dotall мәніне қарама-қарсы: жолды бөлгіштер табылмайды. Мысалы, пәрмен Java RegexDemo . \n
жаңа жол таңбасын таба алмайды.
(?m)
^
: Әр жолдың басы мен $
соңына сәйкес келетін көп жолды режимді қосады . Мысалы, java RegexDemo "(?m)^abc$" abc\nabc
кіріс мәтініндегі екі ретті де табады abc
. Әдепкі бойынша, бір жолды режим пайдаланылады: ^
бүкіл енгізу мәтінінің басына сәйкес келеді және $
оның соңына сәйкес келеді. Мысалы, java RegexDemo "^abc$" abc\nabc
сәйкестіктер жоқ деген жауапты қайтарады.
(?u)
: Юниcodeқа сезімтал регистрді туралауды қосады. Бұл жалауша, -мен бірге пайдаланылғанда (?i)
, Юниcode стандартына сәйкес регистрді ескермейтін үлгіні сәйкестендіруге мүмкіндік береді. Әдепкі параметр тек регистрді және US-ASCII таңбаларын іздеу болып табылады.
(?d)
: Unix стиліндегі жол режимін қосады, мұнда сәйкестік мәтінмәндегі метатаңбаларды .
және ^
тек $
жолды бөлгішті таниды \n
. Әдепкі - Unix мәнері емес жол режимі: сәйкестендіруші жоғарыдағы метатаңбалар контекстінде барлық жол бөлгіштерін таниды.
Кірістірілген жалау өрнектері түсірілген топтарға ұқсайды, себебі олардың таңбалары жақша метатаңбаларымен қоршалған. Түсірілген топтардан айырмашылығы, кірістірілген жалауша өрнектері мәтін таңбаларын түсірмейтін тұрақты өрнек құрылымы болып табылатын түсірілмеген топтардың мысалы болып табылады. Олар жақшаның метатаңбаларымен қоршалған таңбалар тізбегі ретінде анықталады.
Бірнеше кірістірілген жалау өрнектерін көрсету |
Тұрақты өрнекте бірнеше кірістірілген жалауша өрнектерді оларды қатар қою ( (?m)(?i)) ) немесе оларды ретімен анықтайтын әріптерді орналастыру ( (?mi) ) арқылы көрсетуге болады. |
Қорытынды
Сіз қазір түсінген боларсыз, тұрақты өрнектер өте пайдалы және олардың синтаксисінің нюанстарын меңгерген сайын пайдалырақ бола түседі. Осы уақытқа дейін мен сізді тұрақты тіркестердің негіздерімен және
Pattern
.
Pattern
2-бөлімде біз Regex API интерфейсін тереңірек қарастырамыз және ,
Matcher
және әдістерін зерттейміз
PatternSyntaxException
. Сондай-ақ мен сізге Regex API-дің екі практикалық қосымшасын көрсетемін, оларды сіз бірден бағдарламаларыңызда пайдалана аласыз.
Java тіліндегі тұрақты өрнектер, 3 бөлім Java тіліндегі тұрақты өрнектер, 4 бөлім Java тіліндегі тұрақты өрнектер, 5 бөлім
GO TO FULL VERSION