Jeff Frieseniň JavaWorld web sahypasy üçin ýazan Java dilindäki yzygiderli aňlatmalara gysga gollanmanyň terjimesini size ýetirýäris . Okamagyň aňsatlygy üçin makalany birnäçe bölege böldük.
Nagyşlary tanamak we suratlandyrmak üçin Java programmalarynda yzygiderli aňlatma API-ni ulanmak
“Java” -yň häsiýeti we dürli görnüşli maglumatlar görnüşleri nagyş gabat gelmegi üçin pes derejeli goldawy üpjün edýär, ýöne bu maksat bilen ulanmak adatça möhüm kod çylşyrymlylygyny goşýar. Has ýönekeý we has ýerine ýetiriji kod Regex API ("Regular Expression API") arkaly alynýar. Bu gollanma, yzygiderli aňlatmalar we Regex API bilen başlamaga kömek eder. Ilki bilen bukjadaky iň gyzykly üç synpy ara alyp maslahatlaşarys
java.util.regex
, soňra synpyň içine göz aýlarys
Pattern
we onuň çylşyrymly nagyşlara laýyk gurluşlaryny öwreneris.
Üns beriň: Demo programmasynyň deslapky kody (Jeff Friesen tarapyndan JavaWorld saýty üçin döredilen) şu makaladan şu ýerden göçürip alyp bilersiňiz .
Yzygiderli aňlatmalar näme?
Yzygiderli aňlatma (yzygiderli aňlatma / regex / regexp) belli bir setirler toplumyny suratlandyrýan nagyşdyr. Nusga haýsy setirleriň toplumyna degişlidigini kesgitleýär. Bu nagyş göçme manyda däl-de, aýratyn manyly nyşanlardan ybaratdyr. Nusga gabat gelmegi, gabat gelýänleri tapmak üçin tekst gözlemek, ýagny yzygiderli aňlatma görnüşine gabat gelýän setirler. Java, Regex API arkaly nagyş gabat gelmegini goldaýar. Bu API üç synpdan ybarat:
Pattern
we
Matcher
bukjada
PatternSyntaxException
ýerleşýän
java.util.regex
:
- synp obýektleri
Pattern
, şablonlar hem diýilýär, yzygiderli aňlatmalar düzülýär.
- synp obýektleri
Matcher
ýa-da gabat gelýänler, nyşanlaryň yzygiderliliginde gabat gelýänleri tapmagyň nagyşlaryny düşündirmek mehanizmleridir (synplary interfeýsi amala aşyrýan java.lang.CharSequence
we tekst çeşmesi bolup hyzmat edýän obýektler).
- Synp obýektleri
PatternSyntaxException
nädogry yzygiderli aňlatma nagyşlaryny beýan etmek üçin ulanylýar.
Java, şeýle hem dürli usullar arkaly nagyş gabat gelmegini goldaýar
java.lang.String
. Mysal üçin, çagyryş setiri adaty aňlatma bilen gabat gelse, funksiýa
boolean matches (String regex)
gaýdyp gelýär .
true
regex
Amatly usullar |
matches() we synpyň yzygiderli aňlatmaga gönükdirilen amatly usullary, String kapotyň aşagynda Regex API-e meňzeş görnüşde amala aşyrylýar. |
RegexDemo
Java -
RegexDemo
yň yzygiderli aňlatmalaryny we dürli usullaryny görkezmek üçin programma döretdim we
Pattern
. Aşakda bu demo programmasynyň deslapky kody. Sanaw 1. Adaty aňlatma görkezişi
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
Synp usulynyň ilkinji edýän zady
RegexDemo
, buýruk setirini barlamakdyr. Iki argument talap edýär: birinjisi yzygiderli aňlatma, ikinjisi adaty aňlatmanyň gözlenýän giriş tekstidir. Giriş tekstiniň içinde täze setir belgisini ulanmaly bolmagyňyz mümkin
(\n)
.
\
Bu diňe simwolyň yzyndan gelýän nyşanlary görkezmek arkaly amala aşyrylyp bilner
n
. Funksiýa
main()
bu nyşan yzygiderliligini icunikod bahasyna öwürýär.
Kodyň esasy
RegexDemo
bölegi
try-catch
. Blok
try
ilki bilen berlen yzygiderli aňlatmany we giriş tekstini çykarýar, soňra bolsa
Pattern
yzygiderli yzygiderli aňlatmany saklaýan bir obýekt döredýär (yzygiderli aňlatmalar nagyş gabat gelýän öndürijiligi gowulandyrmak üçin düzülýär). Obýektden bir matç çykarylýar
Pattern
we hemmesi tapylýança gabat gelýänleri gözlemek üçin ulanylýar. Blok kadadan çykma barada peýdaly maglumatlary almak üçin
catch
birnäçe synp usullaryny çagyrýar .
PatternSyntaxException
Bu maglumatlar yzygiderli çykyş akymyna çykýar. Koduň nähili işleýändigi barada jikme-jiklikleri bilmek zerurlygy ýok: makalanyň ikinji bölüminde API-ni öwrenenimizde aýdyň bolar. Şeýle-de bolsa, Sanawy düzmeli. 1-nji sanawdan kody alyň we düzmek üçin buýruk buýrugyna aşakdaky buýrugy ýazyň
RegexDemo
:
javac RegexDemo.java
Nusga synpy we gurluşlary
Regex API-ni emele getirýän üç synpyň ilkinjisi
Pattern
, adaty aňlatmanyň jemlenen görnüşi. SDK synp resminamalary
Pattern
dürli yzygiderli aňlatma gurluşlaryny suratlandyrýar, ýöne yzygiderli aňlatmalary işjeň ulanmasaňyz, bu resminamalaryň bölekleri bulaşyk bolup biler. Hasaplaýjylar näme we açgöz, göwünsiz we eýe mukdarlaryň arasynda näme tapawut bar? Nyşan synplary, araçäk gabat gelýänler, arka salgylanmalar we goýlan baýdak aňlatmalary näme? Bu we beýleki soraglara indiki bölümlerde jogap bererin.
Göni setirler
Iň ýönekeý aňlatma gurluşy sözme-söz setirdir. Nusga gabat gelmegiň üstünlikli bolmagy üçin giriş tekstiniň käbir bölegi şol konstruksiýanyň nusgasyna laýyk gelmelidir. Aşakdaky mysaly gözden geçiriň: Bu mysalda, giriş tekstindäki
java RegexDemo apple applet
nagyş üçin laýyk tapmaga synanyşýarys . Aşakdaky netije tapylan oýny görkezýär:
apple
applet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Çykyşda yzygiderli aňlatmany we giriş tekstini, soňra bolsa
apple
programmada üstünlikli tapmagyň görkezijisini görýäris. Mundan başga-da, bu oýnuň başlangyç we ahyrky pozisiýalary berilýär:
0
we
4
degişlilikde. Başlangyç ýagdaýy, tekstiň tapylan ýerinde birinji orny, ahyrky ýagdaýy bolsa oýnuň soňky nokadyny görkezýär. Indi aşakdaky buýruk setirini berdik diýeliň:
java RegexDemo apple crabapple
Bu gezek dürli başlangyç we ahyrky pozisiýalar bilen aşakdaky netijäni alýarys:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Otherwiseogsam,
applet
adaty aňlatma bilen
apple
- giriş teksti bilen hiç hili gabat gelmez. Regularhli yzygiderli aňlatma gabat gelmeli, ýöne bu ýagdaýda giriş teksti
t
soňundan ýok
apple
.
Metacharacters
Has gyzykly yzygiderli aňlatma gurluşlary gönümel nyşanlary metacharacters bilen birleşdirýär. Mysal üçin, yzygiderli aňlatmada
a.b
nokat metacharacter we b
(.)
arasyndaky islendik nyşanlary aňladýar .
a
Aşakdaky mysaly gözden geçiriň:
java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
Bu mysal
.ox
adaty aňlatma hökmünde we
The quick brown fox jumps over the lazy ox.
giriş teksti hökmünde ulanylýar. Islendik nyşan bilen başlaýan we ýerine ýetirilişiniň netijeleri aşakdaky ýaly
RegexDemo
gabat gelýän tekstleri gözleýär :
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
Çykyşda iki gabat gelýäris:
fox
we
ox
(öňünde boşluk belgisi bilen). Metacharacter birinji ýagdaýda
.
bir nyşan
f
, ikinjisinde boşluk bilen gabat gelýär.
.ox
Ony metacharacter bilen çalyşsaňyz näme bolar
.
? Theagny, aşakdaky buýruk setiriniň netijesinde alýan zatlarymyz:
java RegexDemo . "The quick brown fox jumps over the lazy ox."
Nokat metacharacter islendik nyşan bilen gabat gelýänligi sebäpli,
RegexDemo
giriş tekstiniň ähli nyşanlary (yzky nokat belgisini goşmak bilen) tapylan gabat gelýänleri çykarar:
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
Metacharacterleri sitata |
Adaty aňlatma gurluşynda göçme manyda häsiýet hökmünde kesgitlemek . ýa-da başga bir metacharacter, aşakdaky usullaryň birinde gaçmaly:
- yza gaýtmak häsiýeti bilen öňünden;
- Bu metacharacter
\Q bilen \E (mysal üçin \Q.\E ) arasynda goýuň.
String regex = "\\."; Yzky çyzgylar (mysal üçin \\. ýa-da ) ýaly sözme-söz manyda peýda bolan nyşanlary köpeltmegi ýatdan çykarmaň \\Q.\\E . Buýruk setiri argumentiniň bir bölegi bolan şol arka ýazgylary köpeltmäň. |
Nyşan sapaklary
Käwagt gözleýän gabat gelýänleriňizi belli bir nyşan bilen çäklendirmeli bolarsyňyz. Mysal üçin, çekimli sesleriň tekstini gözläň we we her bir çekimli harpyň gabat gelmegi bilen gözläň
a
. Şeýle meseleleri çözmekde bize kwadrat ýaýyň () metacharacterleriniň arasyndaky nyşanlaryň toplumyny kesgitleýän nyşan synplary kömek eder . Bu synp ýönekeý nyşan synplaryny, aralyk synplaryny, ters, birleşme, kesişme we aýyrmak synplaryny goldaýar. Olaryň hemmesine indi serederis.
e
i
o
u
[ ]
Pattern
Simönekeý häsiýet synplary
Simpleönekeý nyşan synpy gapdalynda ýerleşdirilen nyşanlardan durýar we diňe şol nyşanlara gabat gelýär. Mysal üçin , synp
[abc]
nyşanlara gabat gelýär
a
we
b
.
c
Aşakdaky mysaly gözden geçiriň:
java RegexDemo [csw] cave
Netijelerden görnüşi ýaly, bu mysalda diňe
c
gabat gelýän häsiýet
cave
:
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0
Ters nyşan nyşanlary
Tersine nyşan synpy metacharacter bilen başlaýar
^
we diňe içindäki nyşanlara gabat gelýär. Mysal üçin, synpdan başga
[^abc]
ähli nyşanlara gabat gelýär we . Aşakdaky mysaly gözden geçiriň: Operasiýa ulgamymda (Windows) goşa dyrnaklaryň hökmanydygyny belläň, sebäbi gabyk olara gaçmak nyşany hökmünde seredýär. Görşüňiz ýaly, bu mysalda diňe simwollar tapyldy we tapyldy , munuň üçin gabat gelýänler bar :
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
Aralyk nyşanlary
Aralyk nyşan synpy defis (
-
) bilen bölünen iki simwoldan ybarat. Nyşanlaryň çep tarapyndaky nyşanlardan başlap, nyşanlaryň sag tarapyna çenli gutarýan ähli nyşanlar diapazonyň bir bölegidir. Mysal üçin,
[a-z]
diapazon latyn harplarynyň hemmesine gabat gelýär. Bu ýönekeý synpy kesgitlemek bilen deňdir
[abcdefghijklmnopqrstuvwxyz]
. Aşakdaky mysaly gözden geçiriň:
java RegexDemo [a-c] clown
Bu mysal diňe
c
gabat gelýän nyşan bilen gabat geler
clown
:
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java-da yzygiderli aňlatmalar, 2-nji bölüm Java-da yzygiderli aňlatmalar, 3-nji bölüm Java-da yzygiderli aňlatmalar, 4-nji bölüm Java-da yzygiderli aňlatmalar, 5-nji bölüm
GO TO FULL VERSION