JavaRush /Java Blog /Random-TK /Java-da yzygiderli aňlatmalar (RegEx)

Java-da yzygiderli aňlatmalar (RegEx)

Toparda çap edildi
Yzygiderli aňlatmalar programmistleriň, hatda tejribeli adamlaryňam köplenç soňa goýýan mowzugy. Şeýle-de bolsa, Java döredijileriň köpüsi iru-giç teksti gaýtadan işlemek bilen meşgullanmaly bolarlar. Köplenç - tekstdäki gözleg amallary we redaktirleme bilen. Yzygiderli aňlatmalar bolmazdan, teksti gaýtadan işlemek bilen baglanyşykly öndürijilikli we ykjam programma kody pikir edip bolmaýar. Şonuň üçin goýmagy bes ediň, geliň şu wagt “yzygiderli” bilen iş salyşalyň. Bu beýle kyn mesele däl.

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:
  1. yzygiderli aňlatma sintaksisini ulanyp, setir hökmünde ýazyň;
  2. bu setiri yzygiderli aňlatmak;
Islendik Java programmasynda yzygiderli aňlatmalar bilen işlemek synp obýektini döretmekden başlaýar 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 Patternwe 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 Patternyzygiderli aňlatma konstruktorydyr. Kapotyň aşagyndaky usul, düzülen görnüşi döretmek üçin compilesynpyň 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:
1. Çyzyk araçäklerine ýa-da tekste laýyk gelýän görkezijiler
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
2. Nyşan synplaryny gözlemek üçin metacharacters
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
3. Tekst redaktirleme nyşanlaryny gözlemek üçin metacharacters
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
4. Nyşanlary toparlamak üçin görkezijiler
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)
5. Nyşanlaryň sanyny kesgitlemek üçin metasymbollar. Hasaplaýjy elmydama bir nyşan ýa-da nyşan toparyndan soň gelýär.
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:
  1. Berlen nagyşda birinji harp rus harpydyr А. Matchernoldan başlap, tekstiň her bir nyşanyna gabat gelýär. Tekstimizdäki nol ýerde bir nyşan bar Е, şonuň üçin Matchertekstdäki nyşanlardan nagyş bilen gabat gelýänçä yzygiderli geçýär. Mysalymyzda, bu 5-nji ýerdäki nyşandyr.

    Java-da yzygiderli aňlatmalar - 2
  2. Nusganyň birinji harpy bilen gabat gelenden soň, Matchernagşyň ikinji nyşany bilen gabat gelýär. Biziň ýagdaýymyzda, bu .islendik nyşan üçin “" ”nyşanydyr.

    Java-da yzygiderli aňlatmalar - 3

    Altynjy orunda harp nyşany bar л. Elbetde, "islendik nyşan" görnüşine gabat gelýär.

  3. Matchernagyş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, Matcherindiki 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).

    Java-da yzygiderli aňlatmalar - 4

    Aslynda, Matcherol ähli setiri ahyryna çenli ele alýar - şu ýerde "açgözlügi" özüni görkezýär.

  4. MatcherMatç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:

    Java-da yzygiderli aňlatmalar - 5
  5. 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: Java-da yzygiderli aňlatmalar - 6

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. Java-da yzygiderli aňlatmalar - 7

Yalta mukdar tertibi

  1. 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:

    Java-da yzygiderli aňlatmalar - 8
  2. Ondan soň, nagyşdaky indiki nyşan bilen - islendik nyşan bilen deňeşdirme gözleýär:

    Java-da yzygiderli aňlatmalar - 9
  3. 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ň, Matchertekstiň galan nagyşlara - “ а” nyşanyna laýyk gelýändigini barlar.

    Java-da yzygiderli aňlatmalar - 10
  4. Tekstdäki nagyş bilen gabat gelýän zat tapylmandygy sebäpli (tekstdäki 7-nji ýerde "" л"nyşany bar), Matcherbir ý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:

    Java-da yzygiderli aňlatmalar - 11
  5. 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.

    Java-da yzygiderli aňlatmalar - 12
Usulyň netijesinde, 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

Synpda Patternyzygiderli 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()- flagsdö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 limittekstde gözlenýän gabat gelýänleriň sanyny kesgitleýär:
  • haçan limit>0- gabat gelýänleri gözlemek limit-1amala 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;
Mysal:
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

Matchernagyş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 Matchersynpda 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. StringDiňe däl , eýsem StringBuffer, StringBuilderhem argument hökmünde Segmentgeçip bilersiňiz CharBuffer. Gözleg şablony, Patternusulyň 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 replaceFirstdö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 . replaceAllStringreplaceFirstreplaceAllMatcherPatternMatcherStringsplitmatchesreplaceFirstreplaceAllPatternMatcherStringPatternMatcher

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 üçin Patternsynp obýektini ulanýar . MatcherBaş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.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION