RegEx yzygiderli aňlatma näme?
Aslynda, yzygiderli aňlatma (Java-da RegEx) tekstde setir gözlemek üçin nagyşdyr. Java-da bu nagşyň başlangyç görnüşi elmydama setir, ýagny String synpynyň obýekti bolup durýar. Şeýle-de bolsa, haýsydyr bir setiri yzygiderli aňlatmaga jemläp bolmaýar, diňe yzygiderli aňlatma ýazmagyň kadalaryna eýerýänler - dil spesifikasiýasynda kesgitlenen sintaksis. Yzygiderli aňlatma ýazmak üçin elipbiý we san belgileri, şeýle hem yzygiderli aňlatmalaryň sintaksisinde aýratyn many berýän nyşanlar ulanylýar. Mysal üçin:String regex = "java"; // string template "java";
String regex = "\\d{3}"; // string template of three numeric characters;
Java-da yzygiderli aňlatmalar döretmek
Java-da RegEx döretmek üçin iki sany ýönekeý ädim ätmeli:- yzygiderli aňlatma sintaksisini ulanyp, setir hökmünde ýazyň;
- bu setiri yzygiderli aňlatmak;
Pattern
. Munuň üçin synpda bar bolan iki statiki usuldan birini çagyrmaly compile
. Birinji usul bir argument alýar - adaty aňlatmanyň sözme-söz, ikinjisi - şablony tekst bilen deňeşdirmek tertibini açýan başga bir parametr:
public static Pattern compile (String literal)
public static Pattern compile (String literal, int flags)
Mümkin bolan parametr bahalarynyň sanawyflags
synpda kesgitlenendir Pattern
we statiki synp üýtgeýjileri hökmünde elýeterlidir. Mysal üçin:
Pattern pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//searching for matches with the pattern will be done case-insensitively.
Aslynda, synp Pattern
yzygiderli aňlatma konstruktorydyr. Kapotyň aşagyndaky usul, düzülen görnüşi döretmek üçin compile
synpyň hususy konstruktoryny çagyrýar . Pattern
Şablon mysalyny döretmegiň bu usuly, üýtgewsiz obýekt hökmünde döretmek maksady bilen amala aşyrylýar. Döredilende, adaty aňlatmanyň sintaksis barlagy geçirilýär. Setirde ýalňyşlyklar bar bolsa, kadadan çykma döredilýär PatternSyntaxException
.
Yzygiderli aňlatma sintaksis
<([{\^-=$!|]})?*+.>
Yzygiderli aňlatma sintaksis , elipbiý nyşanlary bilen birleşdirilip bilinjek nyşanlaryň ulanylmagyna esaslanýar . Rollaryna baglylykda olary birnäçe topara bölmek bolar:
Metacharacter | Maksat |
---|---|
^ | setiriň başlangyjy |
$ | setiriň soňy |
\ b | söz araçägi |
\ B. | söz çäkleri däl |
\ A. | girişiň başlangyjy |
\ G. | öňki oýnuň soňy |
\ Z. | girişiň soňy |
\ z | girişiň soňy |
Metacharacter | Maksat |
---|---|
\ d | sanly nyşan |
\ D. | san däl häsiýet |
\ s | giňişlik häsiýeti |
\ S. | giňişlik däl häsiýet |
\ w | harp belgisi ýa-da aşaky çyzgy |
\ W. | elipbiý, san ýa-da aşaky çyzgydan başga islendik nyşan |
. | islendik nyşan |
Metacharacter | Maksat |
---|---|
\ t | goýmanyň nyşany |
\ n | täze setir |
\ r | wagonyň gaýdyp geliş häsiýeti |
\ f | täze sahypa geç |
\ u0085 | indiki setir belgisi |
\ u 2028 | setir bölüji nyşan |
\ u 2029 | abzas bölüji nyşany |
Metacharacter | Maksat |
---|---|
[a B C] | ýokardakylaryň haýsydyr biri (a, b ýa-da c) |
[^ abc] | sanalanlardan başga (a, b, c däl) |
[a-zA-Z] | diapazony birleşdirmek (latyn harplary a-z harplara duýgur däl) |
[mahabat [mp]] | nyşanlaryň birleşmesi (a-dan d we m-den p) |
[az && [def]] | nyşanlaryň kesişmesi (d, e, f nyşanlary) |
[az && [^ bc]] | nyşanlary aýyrmak (a, dz nyşanlary) |
Metacharacter | Maksat |
---|---|
? | biri ýa-da ýitirim |
* | nol ýa-da has köp gezek |
+ | bir ýa-da birnäçe gezek |
{n} | n gezek |
{n,} | n gezek ýa-da has köp |
{n, m} | n gezekden az we m gezekden köp bolmaly däldir |
Açgöz mukdar tertibi
Hasaplaýjylaryň aýratyn aýratynlygy, olary dürli reesimlerde ulanmak ukybydyr: açgöz, aşa açgöz we ýalta. Açgözlük re modeimi+
mukdardan soň “” nyşanyny, ýalta re modeimi “” nyşanyny goşmak bilen açylýar ?
. Mysal üçin:
"A.+a" // greedy mode
"A.++a" // over-greedy mode
"A.+?a" // lazy mode
Bu şablony mysal hökmünde ulanyp, ölçegleriň dürli reesimlerde nähili işleýändigine düşünmäge synanyşalyň. Düzgüne görä, mukdar açgöz re inimde işleýär. Bu setirde mümkin bolan iň uzyn oýny gözleýändigini aňladýar. Bu kody işletmegiň netijesinde:
public static void main(String[] args) {
String text = "Egor Alla Alexander";
Pattern pattern = Pattern.compile("A.+a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(text.substring(matcher.start(), matcher.end()));
}
}
aşakdaky netijäni alarys: Alla Alexa Berlen nagyş üçin gözleg algoritmi А.+а
aşakdaky yzygiderlilikde ýerine ýetirilýär:
-
Berlen nagyşda birinji harp rus harpydyr
А
.Matcher
noldan başlap, tekstiň her bir nyşanyna gabat gelýär. Tekstimizdäki nol ýerde bir nyşan barЕ
, şonuň üçinMatcher
tekstdäki nyşanlardan nagyş bilen gabat gelýänçä yzygiderli geçýär. Mysalymyzda, bu 5-nji ýerdäki nyşandyr. -
Nusganyň birinji harpy bilen gabat gelenden soň,
Matcher
nagşyň ikinji nyşany bilen gabat gelýär. Biziň ýagdaýymyzda, bu.
islendik nyşan üçin “" ”nyşanydyr.Altynjy orunda harp nyşany bar
л
. Elbetde, "islendik nyşan" görnüşine gabat gelýär. -
Matcher
nagyşdan indiki nyşany barlamaga geçýär. Şablonymyzda “.+
” mukdar kesgitleýjisi ulanylýar. Nusgadaky “islendik nyşan” gaýtalanýanlaryň sany bir ýa-da birnäçe gezek bolany üçin,Matcher
indiki harpy setirden alýar we “islendik nyşan” şerti ýerine ýetirilýänçä, nagşyň ýerine ýetirilişini barlaýar, mysalymyzda - setiriň ahyryna çenli (tekstiň No. 7 - No. 18 pozisiýasyndan).Aslynda,
Matcher
ol ähli setiri ahyryna çenli ele alýar - şu ýerde "açgözlügi" özüni görkezýär. -
Matcher
Matçer tekstiň soňuna ýetip, nagşyň “” bölegini barlamagy gutarandan soňА.+
, Matçer nagşyň galan bölegini - harp nyşanyny barlap başlaýarа
. Öňe ugrukdyrylan tekst gutaransoň, soňky harpdan başlap, ters tarapda bolýar: -
Matcher
"nagyşdaky gaýtalanmalaryň sanyny" ýada salýar.+
"tekstiň soňuna ýetensoň, gaýtalanýanlaryň sanyny bir gezek azaldar we gabat gelýänçä tekstiň nusgasyny barlaýar:
Ultra açgöz mukdar derejesi
Örän açgöz re modeimde, açar açgöz re modeim mehanizmine meňzeýär. Tapawut, teksti setiriň ujuna tutanyňyzda yza gaýdyp gözleg bolmaz. Superagny, aşa açgöz re modeimde ilkinji üç basgançak açgöz re modeime meňzeýär. Stringhli setiri ele alandan soň, gabat gelýän nagşyň galan bölegini goşýar we tutulan setir bilen deňeşdirýär. Mysal üçin, esasy usuly "А.++а
" nagşy bilen ýerine ýetirenimizde hiç hili gabat gelmez.
Yalta mukdar tertibi
-
Bu re Inimde, başlangyç etapda, açgöz re modeimde bolşy ýaly, nagşyň birinji gahrymany bilen bir oýun gözlenýär:
-
Ondan soň, nagyşdaky indiki nyşan bilen - islendik nyşan bilen deňeşdirme gözleýär:
-
Açgöz re modeimden tapawutlylykda, ýalta re modeim tekstdäki iň gysga oýny gözleýär, şonuň üçin nokat bilen kesgitlenen we tekstiň 6-njy pozisiýasyndaky nyşan bilen gabat gelýän nagşyň ikinji nyşany bilen gabat gelýänini tapandan soň,
Matcher
tekstiň galan nagyşlara - “а
” nyşanyna laýyk gelýändigini barlar. -
Tekstdäki nagyş bilen gabat gelýän zat tapylmandygy sebäpli (tekstdäki 7-nji ýerde ""
л
"nyşany bar),Matcher
bir ýa-da birnäçe gezek görkezilýändigi sebäpli, nagyşda başga" islendik nyşan "goşýar, we nagşy ýene-de 5-den 8-e çenli pozisiýalardaky tekst bilen deňeşdirýär: -
Biziň ýagdaýymyzda bir oýun tapyldy, ýöne tekstiň soňy entek ýetilmedi. Şonuň üçin 9-njy pozisiýadan barlamak, şuňa meňzeş algoritm ulanyp, nagşyň birinji harpyny gözlemekden başlaýar we tekstiň ahyryna çenli gaýtalanýar.
main
"" şablony ulananymyzda А.+?а
, aşakdaky netijäni alarys: Alla Alexa Mysaldan görnüşi ýaly, bir şablon üçin dürli mukdar reesimlerini ulananymyzda dürli netijeler gazandyk. Şonuň üçin bu aýratynlygy göz öňünde tutup, gözleg wagtynda islenýän netijä baglylykda islenýän re modeimi saýlamaly.
Nyşanlary yzygiderli aňlatmak
Java-da yzygiderli aňlatma, has dogrusy, ilkibaşdaky aňlatma sözme-söz manyda kesgitlenýänligi sebäpli, Java spesifikasiýasynyň setir sözlerine degişli düzgünlerini göz öňünde tutmaly. Hususan-da,\
Java deslapky kodyndaky göçme manyda "" yzyna gaýdýan nyşan, düzüjini yzarlaýan nyşanlaryň aýratyn bir häsiýetdigini we aýratyn düşündirilmelidigini duýdurýan gaçmak nyşany hökmünde düşündirilýär. Mysal üçin:
String s = "The root directory is \nWindows";//wrap Windows to a new line
String s = "The root directory is \u00A7Windows";//insert paragraph character before Windows
\
Şonuň üçin yzygiderli aňlatmany beýan edýän we " " nyşanyny (mysal üçin, metacharacterler üçin) ulanýan simli sözlerde , Java bytekod düzüjisi başgaça düşündirmezligi üçin iki esse köpelmeli . Mysal üçin:
String regex = "\\s"; // template for searching for space characters
String regex = "\"Windows\""; // pattern to search for the string "Windows"
"Adaty" nyşan hökmünde ulanmagy meýilleşdirýän bolsak, goşa arka belgisi aýratyn nyşanlardan gaçmak üçin hem ulanylmalydyr. Mysal üçin:
String regex = "How\\?"; // template for searching the string "How?"
Nusga synpynyň usullary
SynpdaPattern
yzygiderli aňlatmalar bilen işlemegiň başga usullary bar: String pattern()
- obýektiň döredilen adaty aňlatmanyň asyl setir görnüşini görkezýär Pattern
:
Pattern pattern = Pattern.compile("abc");
System.out.println(Pattern.pattern())//"abc"
static boolean matches(String regex, CharSequence input)
- regex parametrinde parametrde berlen tekste garşy yzygiderli aňlatmany barlamaga mümkinçilik berýär input
. Yza gaýdyp gelýär: dogry - eger tekst nagyş bilen gabat gelýän bolsa; ýalan - başgaça; Mysal:
System.out.println(Pattern.matches("A.+a","Alla"));//true
System.out.println(Pattern.matches("A.+a","Egor Alla Alexander"));//false
int flags()
- flags
döredilende kesgitlenen şablon parametr bahalaryny ýa-da bu parametr kesgitlenmedik bolsa 0-ny yzyna berýär. Mysal:
Pattern pattern = Pattern.compile("abc");
System.out.println(pattern.flags());// 0
Pattern pattern = Pattern.compile("abc",Pattern.CASE_INSENSITIVE);
System.out.println(pattern.flags());// 2
String[] split(CharSequence text, int limit)
- parametr hökmünde geçen teksti elementleriň hataryna bölýär String
. Parametr limit
tekstde gözlenýän gabat gelýänleriň sanyny kesgitleýär:
- haçan
limit>0
- gabat gelýänleri gözlemeklimit-1
amala aşyrylýar; limit<0
- tekstdäki ähli gabat gelýänleri gözleýär- haçan
limit=0
- tekstdäki ähli gabat gelýänleri gözleýär, massiwiň soňundaky boş setirler taşlanýar;
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("\\s");
String[] strings = pattern.split(text,2);
for (String s : strings) {
System.out.println(s);
}
System.out.println("---------");
String[] strings1 = pattern.split(text);
for (String s : strings1) {
System.out.println(s);
}
}
Konsol çykyşy: Egor Alla Anna -------- Egor Alla AnnaMatcher
Aşakda obýekt döretmek üçin başga bir synp usulyna serederis.
Matç synp usullary
Matcher
nagyşlary gözlemek üçin obýektiň döredilen synpydyr. Matcher
- bu "gözleg motory", yzygiderli aňlatmalaryň "hereketlendirijisi". Gözlemek üçin oňa iki zat berilmeli: gözleg nusgasy we gözlemek üçin “salgy”. Obýekt döretmek üçin Matcher
synpda aşakdaky usul berilýär Pattern
: рublic Matcher matcher(CharSequence input)
Argument hökmünde usul gözlegiň geçiriljek nyşanlarynyň yzygiderliligini alýar. Bular interfeýsi amala aşyrýan synplaryň obýektleri CharSequence
. String
Diňe däl , eýsem StringBuffer
, StringBuilder
hem argument hökmünde Segment
geçip bilersiňiz CharBuffer
. Gözleg şablony, Pattern
usulyň atlandyrylýan synp obýektidir matcher
. Matçeri döretmegiň mysaly:
Pattern p = Pattern.compile("a*b");// compiled the regular expression into a view
Matcher m = p.matcher("aaaaab");//created a search engine in the text “aaaaab” using the pattern "a*b"
Indi “gözleg motorymyzyň” kömegi bilen gabat gelýänleri gözläp, tekstdäki oýnuň ýagdaýyny bilip we synp usullaryny ulanyp teksti çalşyp bileris. Usul boolean find()
tekstdäki indiki oýny nagyş bilen gözleýär. Bu usuly we aýlaw operatoryny ulanyp, hadysanyň modeline görä tutuş teksti seljerip bilersiňiz (hadysa ýüze çykanda zerur amallary ýerine ýetiriň - tekstde gabat gelýänini tapyp bilersiňiz). Mysal üçin, bu synpyň usullaryny ulanyp, tekstdäki oýnuň ýagdaýyny kesgitläp bilersiňiz we usullary ulanyp int start()
, tekstdäki gabat gelýänleri başga bir tekst bilen çalşyp bilersiňiz. Mysal: int end()
String replaceFirst(String replacement)
String replaceAll(String replacement)
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("A.+?a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start=matcher.start();
int end=matcher.end();
System.out.println("Match found" + text.substring(start,end) + " с "+ start + " By " + (end-1) + "position");
}
System.out.println(matcher.replaceFirst("Ira"));
System.out.println(matcher.replaceAll("Olga"));
System.out.println(text);
}
Programmanyň netijesi: Alla 5-den 8-e çenli pozisiýa tapyldy Bir oýun Anna-dan 10-dan 13-e çenli aralykda tapyldy Egor Ira Anna Egor Olga Olga Egor Alla Anna Mysaldan usullaryň täze bir obýekt - setir replaceFirst
döredýändigi aýdyňdyr . şablon bilen gabat gelýän çeşme teksti, argument hökmünde usula geçen tekst bilen çalşylýar. Mundan başga-da, usul diňe ilkinji oýny we synagdaky ähli oýunlary çalyşýar. Asyl tekst üýtgewsiz galýar. Beýleki synp usullaryny ulanmak , şeýle hem yzygiderli aňlatmalaryň mysallaryny şu makalalar tapgyrynda tapyp bilersiňiz . Tekst bilen işlenende yzygiderli aňlatmalar bilen iň köp ýaýran amallar sapaklardan bolup , içinde gurulýar . Bular ,,, ýaly usullardyr . Inöne aslynda, "kapotyň aşagynda" we . Şol sebäpden, teksti çalyşmak ýa-da gereksiz kod ýazmazdan bir programmadaky setirleri deňeşdirmek zerur bolsa, usullaryny ulanyň . Öňdebaryjy mümkinçilikler gerek bolsa, sapaklar we . replaceAll
String
replaceFirst
replaceAll
Matcher
Pattern
Matcher
String
split
matches
replaceFirst
replaceAll
Pattern
Matcher
String
Pattern
Matcher
Netije
Java programmasynda düzgünler bilen kesgitlenen nagşa gabat gelýän setirleri ulanyp, yzygiderli aňlatma beýan edilýär. Kod işledilende, Java bu setiri synp obýektine jemleýär we tekstdäki gabat gelýänleri tapmak üçinPattern
synp obýektini ulanýar . Matcher
Başda aýdyşym ýaly, yzygiderli aňlatmalar köplenç kyn mowzuk hasaplanýan soňrak goýulýar. Şeýle-de bolsa, sintaksisiň, metacharacterleriň, gaçmagyň we yzygiderli sözlemleriň mysallaryny öwrenýän bolsaňyz, ilkinji seredişinden has ýönekeý bolýar.
GO TO FULL VERSION