JavaRush /Java Blog /Random-TK /Java-da yzygiderli aňlatmalar, 1-nji bölüm

Java-da yzygiderli aňlatmalar, 1-nji bölüm

Toparda çap edildi
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. Java-da yzygiderli aňlatmalar, 1-nji bölüm

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 Patternwe 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: Patternwe Matcherbukjada 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.CharSequencewe tekst çeşmesi bolup hyzmat edýän obýektler).
  • Synp obýektleri PatternSyntaxExceptionnä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 . trueregex
Amatly usullar
matches()we synpyň yzygiderli aňlatmaga gönükdirilen amatly usullary, Stringkapotyň aşagynda Regex API-e meňzeş görnüşde amala aşyrylýar.

RegexDemo

Java - RegexDemoyň 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 MatcherPatternSyntaxException
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;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      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());
      }
   }
}
mainSynp 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. Java-da yzygiderli aňlatmalar, 1-nji bölümKodyň esasy RegexDemobölegi try-catch. Blok tryilki bilen berlen yzygiderli aňlatmany we giriş tekstini çykarýar, soňra bolsa Patternyzygiderli 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 Patternwe hemmesi tapylýança gabat gelýänleri gözlemek üçin ulanylýar. Blok kadadan çykma barada peýdaly maglumatlary almak üçin catchbirnäçe synp usullaryny çagyrýar . PatternSyntaxExceptionBu 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 Patterndü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: appleapplet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Çykyşda yzygiderli aňlatmany we giriş tekstini, soňra bolsa appleprogrammada üstünlikli tapmagyň görkezijisini görýäris. Mundan başga-da, bu oýnuň başlangyç we ahyrky pozisiýalary berilýär: 0we 4degiş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, appletadaty aňlatma bilen apple- giriş teksti bilen hiç hili gabat gelmez. Regularhli yzygiderli aňlatma gabat gelmeli, ýöne bu ýagdaýda giriş teksti tsoňundan ýok apple. Java-da yzygiderli aňlatmalar, 1-nji bölüm

Metacharacters

Has gyzykly yzygiderli aňlatma gurluşlary gönümel nyşanlary metacharacters bilen birleşdirýär. Mysal üçin, yzygiderli aňlatmada a.bnokat metacharacter we b (.)arasyndaky islendik nyşanlary aňladýar . aAşakdaky mysaly gözden geçiriň: java RegexDemo .ox "The quick brown fox jumps over the lazy ox." Bu mysal .oxadaty 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 RegexDemogabat 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: foxwe ox(öňünde boşluk belgisi bilen). Metacharacter birinji ýagdaýda . bir nyşan f, ikinjisinde boşluk bilen gabat gelýär. .oxOny 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, RegexDemogiriş 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 \Qbilen \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. eiou[ ]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 awe b. cAşakdaky mysaly gözden geçiriň: java RegexDemo [csw] cave Netijelerden görnüşi ýaly, bu mysalda diňe cgabat 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 :abcjava RegexDemo "[^csw]" cave^avecave
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 cgabat 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
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION