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

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

Toparda çap edildi
Jeff Frieseniň javaworld web sahypasy üçin ýazan Java-da yzygiderli aňlatmalar üçin gysga gollanmanyň terjimesini size hödürleýäris . Okamagyň aňsatlygy üçin makalany birnäçe bölege böldük. Java-da yzygiderli aňlatmalar, 3-nji bölümJava-da yzygiderli aňlatmalar, 1-nji bölüm Java-da yzygiderli aňlatmalar, 2-nji bölüm

Regex API bilen umumy programmirleme meselelerini ýönekeýleşdiriň

Bu makalanyň 1-nji we 2-nji bölümlerinde yzygiderli aňlatmalar we Regex API bilen tanyşdyňyz. Synp hakda öwrendiňiz Patternwe adaty aňlatma gurluşlaryny görkezýän mysallardan, göni setirleri ulanyp ýönekeý nagyşdan başlap, diapazonlary, araçäkleri we mukdar ölçeglerini ulanyp has çylşyrymly deňeşdirmä çenli gezdiňiz. Bu we indiki bölümlerde birinji bölümde görkezilmedik meselelere serederis, sapaklaryň degişli usullaryny öwreneris Patternwe Matcher. Şeýle hem umumy programmirleme meselelerini aňsatlaşdyrmak üçin yzygiderli aňlatmalaryPatternSyntaxException ulanýan iki sany peýdaly zady öwrenersiňiz . Birinjisi resminamalar üçin koddan düşündirişleri alýar. Ikinjisi, ýygnaýjylaryň, düzüjileriň we şuňa meňzeş programma üpjünçiliginiň möhüm bölegi bolan leksiki derňewi geçirmek üçin döredilen gaýtadan ulanylýan koduň kitaphanasydyr.

GÖRNÜŞ KODY

Bu makaladaky demo programmalary üçin ähli deslapky kody (Jeff Friesen tarapyndan JavaWorld üçin döredilen) şu ýerden alyp bilersiňiz .

Regex API-ni öwrenmek

Patternwe Regex API Matcher- PatternSyntaxExceptionni emele getirýän üç synpdyr. Olaryň her biri koduňyzda yzygiderli aňlatmalary ulanmaga mümkinçilik berýän usullary üpjün edýär.

Nusga synpynyň usullary

Synpyň mysaly Pattern, nagyş hökmünde hem bilinýän düzülen yzygiderli aňlatma. Nusga gabat gelýän amallaryň ýerine ýetirilişini gowulandyrmak üçin yzygiderli aňlatmalar düzülýär. Aşakdaky statiki usullar ýygnamagy goldaýar.
  • Pattern compile(String regex)mazmuny regextäze görnüşde saklanýan aralyk wekilçilige jemleýär Pattern. Bu usul ýa-da üstünlikli bolsa bir obýekte salgylanmany yzyna gaýtaryp berýär, ýa-da PatternSyntaxExceptionnädogry yzygiderli aňlatma sintaksis tapylsa kadadan çykma döredýär. MatcherBu obýekt tarapyndan ulanylan ýa-da yzyna gaýdyp gelen synpyň islendik obýekti Pattern, adaty gözleg ýaly adaty sazlamalary ulanýar. Mysal üçin, kod parçasy nokat nyşany bilen başlaýan setirlere gabat gelmek üçin yzygiderli aňlatmanyň jemlenen görnüşini saklaýan Pattern p = Pattern.compile("(?m)^\\."); obýekt döredýär .Pattern

  • Pattern compile(String regex, int flags)ýaly meseläni çözýär Pattern compile(String regex), ýöne göz öňünde tutup flags: OR görnüşiniň bit baýdaklary üçin bit yzygiderliligi. Synp bitwise OR (mysal üçin ) ulanyp birleşdirilip, argument hökmünde geçip bilýän Patternyzygiderliligi yglan edýär .CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINESCASE_INSENSITIVE | DOTALLflags

  • Bulardan başga ýagdaýlar CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS, 1-nji bölümde görkezilen höwürtge baýdak aňlatmalaryna alternatiwadyr, synpda kesgitlenenlerden başga baýdak hemişelik gabat gelse Pattern, usul Pattern compile(String regex, int flags) kadadan çykma döredýär java.lang.IllegalArgumentException. Mysal üçin, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);öňki mysala deň, hemişelik Pattern.MULTILINEwe ýerleşdirilen baýdak aňlatmasy (?m)şol bir zady edýär.
PatternKäwagt ulanýan baýdaklary bilen birlikde bir obýekte düzülen yzygiderli aňlatmanyň asyl setiriniň nusgasyny almak zerur bolýar . Munuň üçin aşakdaky usullara jaň edip bilersiňiz:
  • String pattern()a düzülen asyl yzygiderli aňlatma setirini görkezýär Pattern.

  • int flags()obýektiň baýdaklaryny görkezýär Pattern.
Obýekti alandan soň Pattern, adatça nagyş gabat gelýän amallary ýerine ýetirmek üçin obýekti almak üçin ulanylýar Matcher. Usul, obýektiň nagşyna gabat gelýän tekst gözleýän Matcher matcher(Charsequence input)obýekti döredýär . Çagyrylanda, bu obýekte salgylanma gaýtarylýar . Mysal üçin, buýruk üýtgeýji tarapyndan görkezilen obýekt üçin gaýdyp gelýär . MatcherinputPatternMatcherMatcher m = p.matcher(args[1]);MatcherPatternp
Bir gezeklik gözleg
static boolean matches(String regex, CharSequence input)Synp usuly obýektleri döretmekde we şablon ulanyp bir gezek gözlemekde Patterntygşytlamaga mümkinçilik berýär . Bu usul nagyş gabat gelse hakyky bolýar , ýogsam ýalňyş gaýdyp gelýär. Adaty aňlatmada sintaksis ýalňyşlygy bar bolsa, usul kadadan çykma döredýär . Mysal üçin, söz düzüminde diňe boşluklaryň we kiçi harplaryň bardygyny tassyklaýan çaplar . PatternMatcherinputregexPatternSyntaxExceptionSystem.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only"));trueall lowercase letters and whitespace only
Java-da yzygiderli aňlatmalar, 3-nji bölüm

Bölünýän tekst

Döredijileriň köpüsinde, tekst esasly işgäri hasaby meýdanlar toplumyna öwürmek ýaly giriş tekstini bölek böleklerine bölmek üçin azyndan bir gezek ýazylan kod bar. Synp Patterniki ýada bölmek usulyny ulanyp, bu ýadaw meseläni has aňsat çözmek mümkinçiligini berýär:
  • Usul, tapylan gabat gelýän zatlara görä String[] split(CharSequence text, int limit)bölünýär we netijeleri bir massiwde gaýtaryp berýär. Her bir massiw elementi, yzygiderli yzygiderlilige gabat gelýän tekst bölegi (ýa-da tekstiň soňy) bilen bölünen tekst yzygiderliligini kesgitleýär. Toplumyň elementleri, görkezilen tertipde .textPatterntext

    Bu usulda, massiw elementleriniň sany parametrlere baglydyr limit, ol hem tapyljak gabat gelýänleriň sanyna gözegçilik edýär.

    • Oňyn baha gabat gelýär limit-1, massiwiň uzynlygy elementlerden köp däl limit.
    • Bahasy negatiw bolsa, mümkin bolan gabat gelýänleriň hemmesi gözlenýär we massiwiň uzynlygy özbaşdak bolup biler.
    • Bahasy nol bolsa, mümkin bolan gabat gelýänleriň hemmesi gözlenýär, massiwiň uzynlygy özbaşdak bolup biler we ahyrynda boş setirler taşlanar.

  • Usul String[] split(CharSequence text)öňki usuly 0 bilen çäk argumenti diýip atlandyrýar we çagyryşynyň netijesini yzyna berýär.
split(CharSequence text)Aşakda işgär hasabyny at, ýaş, poçta salgysy we aýlyk haklary boýunça aýratyn böleklere bölmek meselesini çözmegiň usulynyň netijeleri :
Pattern p = Pattern.compile(",\\s");
String[] fields = p.split("John Doe, 47, Hillsboro Road, 32000");
for (int i = 0; i < fields.length; i++)
   System.out.println(fields[i]);
Aboveokardaky kod, bir boşluk nyşany bilen derrew yzygiderli belgi tapmak üçin yzygiderli aňlatmany suratlandyrýar. Ine, ýerine ýetirişiň netijeleri:
John Doe
47
Hillsboro Road
32000

Şablon çaklamalary we akymlar API

Java 8-de synpda Patternbir usul peýda boldy . Bu usul, nagyş bilen gabat gelmek üçin ulanylýan predikany (boolean gymmaty bolan funksiýa) döredýär. Bu usulyň ulanylyşy aşakdaky kod parçasynda görkezilýär: Predicate asPredicate()
List progLangs = Arrays.asList("apl", "basic", "c", "c++", "c#", "cobol", "java", "javascript", "perl", "python", "scala");
Pattern p = Pattern.compile("^c");
progLangs.stream().filter(p.asPredicate()).forEach(System.out::println);
Bu kod programmirleme dil atlarynyň sanawyny döredýär, soňra harpdan başlaýan ähli atlary tapmak üçin bir nagyş düzýär c. Aboveokardaky koduň soňky setiri, çeşme hökmünde bu sanaw bilen maglumatlaryň yzygiderli akymyny alýar. asPredicate()Ady harp bilen başlanda we akymyň üsti bilen gaýtalanýan Boolean funksiýasyny ulanyp, csüzgüç gurýar, adaty çykyşlara gabat gelýän atlary çap edýär. Bu soňky setir, 1-nji bölümden RegexDemo programmasyndan tanyş aşakdaky yzygiderli aýlaw bilen deňdir:
for (String progLang: progLangs)
   if (p.matcher(progLang).find())
      System.out.println(progLang);

Matç synp usullary

Synpyň mysalynda, synpyň Matcherdüzülen yzygiderli aňlatmasyny düşündirip, nyşanlaryň yzygiderliliginde nagyş gabat gelýän amallary ýerine ýetirmegiň mehanizmi beýan edilýär Pattern. Synpyň obýektleri Matcherdürli gözleg amallaryny goldaýar:
  • Usul boolean find()indiki oýun üçin giriş tekstini gözleýär. Bu usul görkezilen tekstiň başynda ýa-da öňki oýundan soň birinji harpda gözläp başlaýar. Ikinji wariant, diňe şu usula edilen öňki jaň dogry we çözüji täzeden düzülmedik ýagdaýynda mümkindir. Her niçigem bolsa, gözleg üstünlikli bolsa, hakyky bahasy yzyna gaýtarylýar. Bu usulyň mysalyny RegexDemo1-nji bölümde tapyp bilersiňiz.

  • Usul materi boolean find(int start)täzeden düzýär we indiki oýun üçin teksti gözleýär. Görmek parametr bilen görkezilen ýerden başlaýar start. Gözleg üstünlikli bolsa, hakyky bahasy yzyna gaýtarylýar. Mysal üçin, m.find(1);teksti pozisiýadan başlap gözden geçirýär 1(0-njy pozisiýa ähmiýet berilmeýär). Eger parametrde startnegatiw baha ýa-da gabat gelýän tekstiň uzynlygyndan uly baha bar bolsa, bu usul kadadan çykma döredýär java.lang.IndexOutOfBoundsException.

  • Usul boolean matches()ähli teksti bir nagşa laýyklaşdyrmaga synanyşýar. Texthli tekst nagyş bilen gabat gelýän bolsa, hakyky bahany yzyna gaýtaryp berýär. Mysal üçin, söz söz belgisi däldigi üçin kod Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());çykýar .false!

  • Usul boolean lookingAt()görkezilen teksti nagyş bilen gabat getirmäge synanyşýar. Tekstiň haýsydyr bir bölegi nagşa gabat gelýän bolsa, bu usul hakykata gaýdyp gelýär. Usuldan tapawutlylykda matches();, ähli tekst nagyş bilen gabat gelmeli däldir. Mysal üçin, Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());çykar true, sebäbi tekstiň başy abc!diňe söz emele getirýän nyşanlardan durýar.

Synp obýektlerinden tapawutlylykda Patternsynp obýektleri Matcherdöwlet maglumatyny saklaýar. Käwagt nagyş gözlegi gutarandan soň bu maglumatlary arassalamak üçin materi täzeden düzmeli bolmagyňyz mümkin. Çözüjini täzeden düzmek üçin aşakdaky usullar bar:
  • Usul Matcher reset(), ahyryna goşuljak ýagdaýy goşmak bilen, gabat gelýäniň ýagdaýyny täzeden düzýär (0-a täzeden düzüň). Indiki nagyş gözleg işi, gabat gelýän tekstiň başynda başlaýar. Häzirki obýekte salgylanma görkezýär Matcher. Mysal üçin, m.reset();salgylanyjy çözgüdi täzeden düzýär m.

  • Usul Matcher reset(CharSequence text)çözüjiniň ýagdaýyny täzeden düzýär we täze çözüji teksti düzýär text. Indiki nagyş gözleg işi täze matçer tekstiniň başynda başlaýar. Häzirki obýekte salgylanma görkezýär Matcher. Mysal üçin, m.reset("new text");salgylanylýan çözüjini täzeden düzýär mwe täze çözüji teksti düzýär "new text".

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

Soňuna tekst goşmak

Matçiniň soňuna goşuljak ýeri, görnüş obýektiniň soňuna goşulan matç tekstiniň başyny kesgitleýär java.lang.StringBuffer. Bu ýagdaýy aşakdaky usullar ulanýar:
  • Usul gabat gelýän tekst nyşanlaryny okaýar we olary argument bilen görkezilen Matcher appendReplacement(StringBuffer sb, String replacement)obýektiň soňuna goşýar . Bu usul, öňki nagyşdan öňki iň soňky harpda okamagy bes edýär. Ondan soň, usul argument bilen görkezilen görnüşdäki obýektdäki nyşanlary obýektiň soňuna goşýar (setirde öňki gözleg wagtynda alnan tekst yzygiderliligine salgylanmalar bolup biler; bular tutulýan nyşanlaryň we topar belgileriniň kömegi bilen kesgitlenýär ). Netijede, usul iň soňky gabat gelýän nyşan we goşmaça biriniň ýagdaýyna goşuljak gabat gelýän ýagdaýyň bahasyny kesgitleýär we soňra häzirki gabat gelýän adama salgylanma berýär.StringBuffersbStringreplacementStringBufferreplacement($)

  • Bu usul, gabat gelýän entek gabat gelmedik bolsa ýa-da öňki gözleg synanyşygy şowsuz bolsa, kadadan çykma bolýar Matcher appendReplacement(StringBuffer sb, String replacement). Eger setir nagyşda bolmadyk surata düşüriş toparyny görkezýän bolsa, java.lang.IllegalStateExceptionkadadan çykma bolýar .IndexOutOfBoundsExceptionreplacement

  • Usul StringBuffer appendTail(StringBuffer sb)ähli teksti bir obýekte goşýar StringBufferwe şol obýekte salgylanma berýär. Iň soňky usul jaňyndan soň , galan teksti obýekte göçürmek appendReplacement(StringBuffer sb, String replacement)usulyna jaň ediň .appendTail(StringBuffer sb)StringBuffer

Alnan toparlar
1-nji bölümden ýadyňyzda bolsa, surata düşüriş topary gabygyň () metacharacter-de ýerleşdirilen nyşanlaryň yzygiderliligi (). Bu konstruksiýanyň maksady, tapylan nyşanlary nagyş gabat gelende soňraky ulanmak üçin saklamakdyr. Alnan topardaky ähli nyşanlar, gözleg wagtynda bir bitewi hasaplanýar.
Aşakdaky kod deslapky tekstdäki nyşanlaryň yzygiderliligini çalyşmagyň usullaryny appendReplacement(StringBuffer sb, String replacement)we usullaryny çagyrýar : appendTail(StringBuffer sbcatcaterpillar
Pattern p = Pattern.compile("(cat)");
Matcher m = p.matcher("one cat, two cats, or three cats on a fence");
StringBuffer sb = new StringBuffer();
while (m.find())
   m.appendReplacement(sb, "$1erpillar");
m.appendTail(sb);
System.out.println(sb);
Alnan topary we çalyşma tekstindäki salgylanmany ulanmak programma erpillarher gezek ýüze çykandan soň goýmagy aýdýar cat. Bu kody ýerine ýetirmegiň netijesi şeýle: one caterpillar, two caterpillars, or three caterpillars on a fence

Teksti çalyşmak

Synp Matcherbize teksti çalyşmagyň iki usuly bilen üpjün edýär appendReplacement(StringBuffer sb, String replacement). Bu usullary ulanyp, [çalşylan tekst] ýa-da ähli hadysalary çalşyp bilersiňiz:
  • Usul materi String replaceFirst(String replacement)täzeden düzýär, täze bir obýekt döredýär String, gabat gelýän tekstiň ähli nyşanlaryny (birinji gabat gelýänçä) şu setire göçürýär, nyşanlary soňuna çenli goşýar replacement, galan nyşanlary setire göçürýär we yzyna gaýtaryp berýär obýekt String(setirde replacementdollar nyşanlaryny we düşürilen topar belgilerini ulanyp, öňki gözleg tekst yzygiderliliginde alnanlara salgylanmalar bolup biler).

  • Usul String replaceAll(String replacement)usula meňzeş işleýär String replaceFirst(String replacement), ýöne replacementtapylan ähli gabat gelýänleri setirdäki simwollar bilen çalyşýar.

Yzygiderli aňlatma \s+giriş tekstindäki bir ýa-da birnäçe giňişlik nyşanlaryny gözleýär. Aşakda bu yzygiderli aňlatmany ulanarys we replaceAll(String replacement)iki gezek boş ýerleri aýyrmagyň usulyna jaň ederis:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем      \t\t лишние пробелы.   ");
System.out.println(m.replaceAll(" "));
Ine netijeler: Удаляем лишние пробелы. 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