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

Java-da yzygiderli aňlatmalar, 2-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, 2-nji bölümJava-da yzygiderli aňlatmalar, 1-nji bölüm
Birnäçe diapazony birleşdirmek
Birnäçe diapazony bir gapdala ýerleşdirip, bir aralyk nyşan synpyna birleşdirip bilersiňiz. Mysal üçin, synp [a-zA-Z]aşaky ýa-da baş harp bilen latyn elipbiýiniň ähli nyşanlaryna gabat gelýär.

Birnäçe diapazony birleşdirmek

Birnäçe diapazony bir gapdala ýerleşdirip, bir aralyk nyşan synpyna birleşdirip bilersiňiz. Mysal üçin, synp [a-zA-Z]aşaky ýa-da baş harp bilen latyn elipbiýiniň ähli nyşanlaryna gabat gelýär.

Nyşan synplaryny birleşdirmek

Nyşanlar synpy birleşýän birnäçe nyşanlardan ybarat bolup, emele gelen birleşigiň ähli nyşanlaryna gabat gelýär. Mysal üçin, synpdan başlap , başdaky nyşanlara [a-d[m-p]]gabat gelýär . Aşakdaky mysaly gözden geçiriň: Bu mysalda gabat gelýän nyşanlary we , we nyşanlary tapar :admpjava RegexDemo [ab[c-e]] abcdefabcdeabcdef
regex = [ab[c-e]]
input = abcdef
Found [a] starting at 0 and ending at 0
Found [b] starting at 1 and ending at 1
Found [c] starting at 2 and ending at 2
Found [d] starting at 3 and ending at 3
Found [e] starting at 4 and ending at 4

Nyşanlaryň kesişmesi

Nyşan synplarynyň kesişmesi, ähli höwürtgelenen synplara mahsus nyşanlardan durýar we diňe umumy nyşanlara gabat gelýär. Mysal üçin , synp [a-z&&[d-f]]nyşanlara gabat gelýär dwe e. fAşakdaky mysaly gözden geçiriň: java RegexDemo "[aeiouy&&[y]]" party Windows operasiýa ulgamymda goşa dyrnagyň hökmanydygyny belläň, sebäbi buýruk gabygy olara &buýruk bölüji hökmünde seredýär. yBu mysal diňe gabat gelýän häsiýeti tapar party:
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4

Nyşan sapaklaryny aýyrmak

Nyşan synplaryny aýyrmak, içerki nyşan synplaryndan başga ähli nyşanlardan durýar we diňe galan nyşanlara gabat gelýär. Mysal üçin, synpdan başlap , aşakdaky [a-z&&[^m-p]]nyşanlara gabat gelýär : Bu mysalda nyşanlary tapar we munuň üçin gabat gelýänler bar : alqzjava RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefgdfabcdefg
regex = [a-f&&[^a-c]&&[^e]]
input = abcdefg
Found [d] starting at 3 and ending at 3
Found [f] starting at 5 and ending at 5

Öňünden kesgitlenen nyşan synplary

Käbir nyşan synplary , stenografiýa belligini ulanmagy esaslandyrmak üçin yzygiderli aňlatmalarda ýeterlik bolýar . Bu synp Patternşeýle gysgaltmalar ýaly öňünden kesgitlenen nyşanlary hödürleýär. Olary yzygiderli aňlatmalaryňyzy aňsatlaşdyrmak we sintaksis ýalňyşlyklaryny azaltmak üçin ulanyp bilersiňiz. Öňünden kesgitlenen nyşanlaryň birnäçe kategoriýasy bar: java.lang.Characterskript, blok, kategoriýa we ikilik ýaly standart, POSIX we icunikod häsiýetleri. Aşakdaky sanawda diňe standart synplaryň kategoriýasy görkezilýär:
  • \d: San. Ekwiwalent [0-9].
  • \D: San däl häsiýet. Ekwiwalent [^0-9].
  • \s: Uly giňişlik Ekwiwalent [ \t\n\x0B\f\r].
  • \S: Ak giňişlik däl. Ekwiwalent [^\s].
  • \w: Söz ýasaýjy nyşan. Ekwiwalent [a-zA-Z_0-9].
  • \W: Söz döredýän häsiýet däl. Ekwiwalent [^\w].
Aşakdaky mysal \wgiriş tekstindäki ähli söz nyşanlaryny suratlandyrmak üçin öňünden kesgitlenen nyşan synpyny ulanýar: java RegexDemo \w "aZ.8 _" Döwrüň we giňişlik nyşanlarynyň söz nyşanlary hasaplanmaýandygyny görkezýän aşakdaky ýerine ýetiriş netijelerine üns beriň:
regex = \w
input = aZ.8 _
Found [a] starting at 0 and ending at 0
Found [Z] starting at 1 and ending at 1
Found [8] starting at 3 and ending at 3
Found [_] starting at 5 and ending at 5
Çyzyk bölüjiler
SDK synp resminamalary Patternnokat metacharacterini, setir bölüjilerinden başga (setiriň soňuny bellän bir ýa-da iki simwol yzygiderliligi) öňünden kesgitlenen nyşan synpy hökmünde suratlandyrýar. Kadadan çykma nokat re modeimi (indiki ara alyp maslahatlaşarys), nokatlar çyzyk bölüjilerine hem gabat gelýär. Synp Patternaşakdaky setir bölüjileri tapawutlandyrýar:
  • wagonyň yzyna gaýtaryş belgisi ( \r);
  • täze setir belgisi (kagyzy bir setir öňe sürmegiň nyşany) ( \n);
  • derrew täze setir belgisi ( \r\n);
  • indiki setir belgisi ( \u0085);
  • setir bölüji nyşan ( \u2028);
  • abzas bölüji nyşan ( \u2029)

Alnan toparlar

Surata alýan topar, nagyş boýunça gözlenende has köp ulanmak üçin tapylan nyşanlaryň toplumyny saklamak üçin ulanylýar. Bu konstruksiýa, gabygyň () metacharacter-de ýerleşdirilen nyşanlaryň yzygiderliligidir ( ). Alnan toparyň içindäki ähli nyşanlar, nagyş boýunça gözlenende bitewi hasaplanýar. Mysal üçin, surata düşüriş topary ( ) Javaharplary birleşdirýär we bir birlige bölýär J. Bu surata düşüriş topary , giriş tekstindäki nagşyň ähli hadysalaryny tapýar . Her bir oýun bilen öňki saklanan nyşanlar indiki harplar bilen çalşyrylýar. Alnan toparlar beýleki tutulan toparlaryň içinde höwürtge döredip biler. Mysal üçin, yzygiderli aňlatmada bir topar bir toparyň içinde höwürtge döredýär . Her bir höwürtgelenen ýa-da höwürtgelemeýän topara 1-den başlap san berilýär we san belgisi çepden saga geçýär. Öňki mysalda, 1-nji topara düşýän gabat gelýänler we 2-nji topara düşýän toparlar gabat gelýär. Adaty aňlatmada , 1-nji topara düşýär we 2-nji topara düşürilýär. Yza çekilen nyşan hökmünde görkezilen toparyň sanyna gabat gelýän san belgisi hökmünde görkezilen, arka ýazgy, topar tarapyndan alnan tekstdäki nyşanlara ýüzlenmäge mümkinçilik berýär. Arka baglanyşygyň bolmagy, gabat gelýän adamyň, alnan san boýunça alnan toparyň saklanan gözleg netijesine salgylanmagyna sebäp bolýar we soňra gözleg üçin şol netijedäki nyşanlary ulanýar. Aşakdaky mysal tekstdäki grammatiki ýalňyşlyklary tapmak üçin yzky salgylanmanyň ulanylyşyny görkezýär: Bu mysal giriş tekstinde derrew yzarlanylýan dublikat söz bilen grammatiki ýalňyşlygy tapmak üçin yzygiderli aňlatmany ulanýar . Bu yzygiderli aňlatma, iki sany topary kesgitleýär: 1-nji belgili , 2-nji belgä we yzyndaky kosmos nyşanyna laýyk gelýär . Yzky salgylanma, 2-nji toparyň saklanan netijesini täzeden gözden geçirmäge mümkinçilik berýär, şeýlelik bilen kosmosyň ikinji gezek ýüze çykmagyny , bir giňişlik ilkinji gezek ýüze çykan badyna derrew we . Duşuşygyň netijeleri aşakdakylar: avaJavaJava(Java( language))(language)(Java)(Java( language))(language)(a)(b)(a)(b)Java-da yzygiderli aňlatmalar, 2-nji bölümjava RegexDemo "(Java( language)\2)" "The Java language language"(Java( language)\2)languageJava"The Java language language"(Java( language)\2)Java language language(language)language\2languagelanguageRegexDemo
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25

Serhet gabat gelýänler

Käwagt bir setiriň başynda, söz araçäklerinde, tekstiň ahyrynda we ş.m. PatternAşakdaky ýerlerde gabat gelýänleri gözleýän yzygiderli aňlatma gurluşlary bolan synp gyrasy gabat gelýänleriň birini ulanyp bilersiňiz :
  • ^: Setiriň başlangyjy;
  • $: Setiriň soňy;
  • \b: Söz araçägi;
  • \B: Pseudoword araçägi;
  • \A: Tekstiň başlangyjy;
  • \G: Öňki oýnuň soňy;
  • \Z: Yzky setir bölüjisini goşmazdan tekstiň soňy (bar bolsa);
  • \z: Tekstiň soňy
Aşakdaky mysal, nol ýa-da has köp söz belgisi ^bilen başlanýan, soňundan nol ýa-da has köp söz nyşanlaryny tapmak üçin araçäk gabat gelýän metacharacter ulanýar: Nyşan giriş tekstiniň ilkinji üç simwolynyň yzygiderli nagyş nyşanlaryna laýyk gelmelidigini we islendik san bilen yzarlap boljakdygyny kesgitleýär . söz emele getirýän nyşanlardan. Ine, ýerine ýetirişiň netijesi: Thejava RegexDemo "^The\w*" Therefore^The
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
Buýruk setirini üýtgedeniňizde näme bolýar java RegexDemo "^The\w*" " Therefore"? Hiç hili gabat gelmez, sebäbi Thereforegiriş teksti kosmos nyşanyndan öň.

Uzynlyk nol

Käwagt, gyralar bilen işleýän wagtyňyz nol uzynlykdaky gabatlaşmalara duşarsyňyz. Совпадение нулевой длиныnyşanlary öz içine almaýan gabat gelýär. Boş giriş tekstinde, giriş tekstiniň başynda, giriş tekstiniň soňky nyşanyndan we giriş tekstiniň islendik iki simwolynyň arasynda bolup biler. Nol uzynlykdaky oýunlary tanamak aňsat, sebäbi olar hemişe şol bir ýagdaýda başlaýar we gutarýar. Aşakdaky mysaly gözden geçiriň: java RegExDemo \b\b "Java is" Bu mysal yzygiderli iki söz araçägini gözleýär we netijeler şuňa meňzeýär:
regex = \b\b
input = Java is
Found [] starting at 0 and ending at -1
Found [] starting at 4 and ending at 3
Found [] starting at 5 and ending at 4
Found [] starting at 7 and ending at 6
Netijelerde birnäçe nol uzynlykdaky oýunlary görýäris. Bu ýerdäki ahyrky pozisiýalar başlangyç pozisiýalardan az, sebäbi RegexDemo1-nji sanawda deslapky kodda görkezdim end() – 1. Java-da yzygiderli aňlatmalar, 2-nji bölüm

Mukdarlar

Hasaplaýjy, nagşy san bahasy bilen aç-açan ýa-da aç-açan baglanyşdyrýan yzygiderli aňlatma gurluşydyr. Bu san bahasy nagşy näçe gezek gözlemelidigini kesgitleýär. Mukdarlar açgöz, ýalta we aşa açgözlere bölünýär:
  • Açgöz mukdar ( ?ýa *-da +) iň uzyn oýny tapmak üçin döredildi. Sorap bilerinmi X? bir ýa-da az hadysany tapmak X, X*nol ýa-da has köp hadysany tapmak X, X+bir ýa-da birnäçe hadysany tapmak X, hadysalary X{n}tapmak , iň bolmanda (we ähtimal has köp) hadysany tapmak we iň bolmanda has köp hadysany tapmak .nXX{n,}nXX{n,m}nmX
  • Yalta mukdar ( ??ýa *?-da +?) iň gysga oýny tapmak üçin döredildi. X??Bir ýa-da az hadysany gözlemek üçin kesgitläp bilersiňiz X, X*? nol ýa-da has köp hadysany tapmak X, X+?bir ýa-da birnäçe hadysany tapmak X, hadysalary X{n}?tapmak , iň bolmanda (we has ähtimal) hadysalary tapmak we iň bolmanda hadysalardan köp däl tapmak .nXX{n,}?nXX{n,m}?nmX
  • Örän açgöz mukdar ( ?+ýa *+-da ++) açgöz mukdarda kesgitleýjä meňzeýär, aşa açgöz mukdar kesgitleýji diňe iň uzyn oýny tapmaga synanyşýar, açgöz mukdar bolsa birnäçe synanyşyk edip biler. X?+Bir ýa-da az hadysany tapmak X, X*+nol ýa-da has köp hadysany tapmak X, X++bir ýa-da birnäçe hadysany tapmak X, ýüze çykanlary X{n}+tapmak , iň bolmanda (we ähtimal has köp) hadysalary tapmak we iň bolmanda hadysalardan köp tapmak üçin düzülip bilner. .nXX{n,}+nXX{n,m}+ nmX
Aşakdaky mysal açgöz mukdaryň ulanylyşyny görkezýär: java RegexDemo .*ox "fox box pox" Ine netijeler:
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
Açgöz mukdar ( .*) gutarýan nyşanlaryň iň uzyn yzygiderliligini tapýar ox. Giriş tekstiniň hemmesini sarp edýär we giriş tekstiniň bu simwollar bilen gutarýandygyny anyklaýança yzyna gaýdýar. Geliň indi ýalta mukdaryna seredeliň: java RegexDemo .*?ox "fox box pox" Netijeleri:
regex = .*?ox
input = fox box pox
Found [fox] starting at 0 and ending at 2
Found [ box] starting at 3 and ending at 6
Found [ pox] starting at 7 and ending at 10
Yalta mukdar ( .*?) gutarýan nyşanlaryň iň gysga yzygiderliligini tapýar ox. Boş setirden başlaýar we gabat gelýänçä simwollary ýuwaş-ýuwaşdan sarp edýär. Soň bolsa giriş teksti gutarýança işlemegini dowam etdirýär. Ahyrynda, aşa açgöz mukdaryna seredeliň: java RegexDemo .*+ox "fox box pox" Ine, onuň netijeleri:
regex = .*+ox
input = fox box pox
Artykmaç açgöz mukdar ( .*+) gabat gelýänleri tapmaýar, sebäbi ähli giriş tekstini sarp edýär we oxadaty aňlatmanyň soňunda gabat gelýän zat galmaýar. Açgöz mukdardan tapawutlylykda, aşa açgöz mukdar yza gaýdyp gelmeýär.

Uzynlyk nol

Käwagt kesgitleýjiler bilen işlän wagtyňyz nol uzynlykdaky gabatlaşmalara duşarsyňyz. Mysal üçin, aşakdaky açgöz ölçegçini ulanmak birnäçe nol uzynlykdaky netijelere getirýär: java RegexDemo a? abaa Bu mysaly işletmegiň netijeleri:
regex = a?
input = abaa
Found [a] starting at 0 and ending at 0
Found [] starting at 1 and ending at 0
Found [a] starting at 2 and ending at 2
Found [a] starting at 3 and ending at 3
Found [] starting at 4 and ending at 3
Executionerine ýetiriş netijelerinde bäş oýun bar. Birinji, üçünji we dördünji garaşylsa-da (üç harpyň pozisiýasyna laýyk gelýär a) abaa, ikinji we bäşinji sizi geň galdyryp biler. Tekstiň soňuna agabat gelýän zady görkezýän ýaly , ýöne aslynda beýle däl. bAdaty aňlatma tekstiň ahyrynda a?gözlemeýär . bBarlygyny ýa-da ýoklugyny gözleýär a. Tapylmasa a?, anol uzynlykdaky oýun hökmünde habar berýär.

Baýdak aňlatmalary

Matçerler adaty aňlatmany bir nagyşa düzenlerinde ýok edip boljak käbir çaklamalary öňe sürýärler. Bu meseläni soňrak ara alyp maslahatlaşarys. Yzygiderli aňlatma, ýerleşdirilen baýdak aňlatmasyny ulanyp, islendik defoltlary ýok etmäge mümkinçilik berýär. Bu yzygiderli aňlatma gurluşy, sorag belgisiniň metacharacter ( ?) töwereginde gabygyň metacharacter hökmünde kesgitlenýär, soňra kiçi harp latyn harpy bilen görkezilýär. Synp Patternaşakdaky baýdak aňlatmalaryna düşünýär:
  • (?i): Case duýgur nagyş gabat gelmegini üpjün edýär. Mysal üçin, buýruk ulanylanda java RegexDemo (?i)tree Treehousenyşanlaryň yzygiderliligi Treenagşa laýyk gelýär tree. Dymmaklyk, kese duýgur nagyş gözlegidir.
  • (?x): Nusgadaky metacharacter-den başlap, giňişlikdäki nyşanlary we düşündirişleri ulanmaga rugsat berýär #. Matçer ikisine-de üns bermez. Mysal üçin, java RegexDemo ".at(?x)#match hat, cat, and so on" matternyşanlaryň yzygiderliligi matnagşa laýyk gelýär .at. Düzgüne görä, giňişlikdäki nyşanlara we düşündirişlere rugsat berilmeýär we gabat gelýän adam gözleg işine gatnaşýan gahrymanlar hökmünde garaýar.
  • (?s): Dotall re modeimini açýar, onda nokat metacharacter beýleki nyşanlara goşmaça çyzyk bölüjilerine gabat gelýär. Mysal üçin, buýruk java RegexDemo (?s). \ntäze setir belgisini tapar. Dymmaklyk nokadyň tersidir: çyzyk bölüjiler tapylmaz. Mysal üçin, buýruk Java RegexDemo . \ntäze setir belgisini tapmaz.
  • (?m)^: Her setiriň başyna we $soňuna gabat gelýän köp ugurly re modeimi işledýär . Mysal üçin, java RegexDemo "(?m)^abc$" abc\nabcgiriş tekstinde iki yzygiderliligi tapýar abc. Düzgüne görä, bir setirli re modeim ulanylýar: ^giriş tekstiniň başyna gabat gelýär we $soňuna gabat gelýär. Mysal üçin, java RegexDemo "^abc$" abc\nabcgabat gelmeýän jogap berýär.
  • (?u): “Unicode” duýgur korpusy deňleşdirmäge mümkinçilik berýär. Bu baýdak, bilelikde ulanylanda (?i), icunikod standartyna laýyklykda kese duýgur nagyş gabat gelmäge mümkinçilik berýär. Bellenen sazlama, diňe kese duýgur we US-ASCII nyşanlary gözlemekdir.
  • (?d): Unix stilindäki setir re modeimini açýar, bu ýerde gabat gelýän kontekstdäki metacharacterleri .we diňe setir bölüjisini tanadýar . Dymmaklyk Unix däl stil setir tertibi: gabat gelýän ýokardaky metacharacterleriň çäginde ähli setir bölüjileri ykrar edýär.^$\n
Öýlenen baýdak aňlatmalary, tutulan toparlara meňzeýär, sebäbi olaryň nyşanlary gabygyň metacharacterleri bilen gurşalan. Alnan toparlardan tapawutlylykda, ýerleşdirilen baýdak aňlatmalary, tekst nyşanlaryny tutmaýan yzygiderli aňlatma gurluşy bolan, tutulmadyk toparlaryň mysalydyr. Gaplaňlaryň metacharacterleri bilen gurşalan nyşanlaryň yzygiderliligi hökmünde kesgitlenilýär.
Birnäçe öýjükli baýdak aňlatmalaryny görkezmek
Birnäçe öýjükli baýdak aňlatmalaryny yzygiderli aňlatmak arkaly ýa-da gapdalda ( (?m)(?i))) ýa-da yzygiderli kesgitleýän harplary ýerleşdirmek arkaly kesgitlemek bolýar (?mi).

Netije

Şu wagta çenli düşünşiňiz ýaly, yzygiderli aňlatmalar gaty peýdaly we sintaksisiň nuanslaryny özleşdireniňizde has peýdaly bolýar. Şu wagta çenli sizi yzygiderli aňlatmagyň esaslary we Pattern. 2-nji bölümde, Regex API-ä has çuňňur serederis we usullaryny Patternöwreneris Matcherwe PatternSyntaxException. Şeýle hem, programmalaryňyzda derrew ulanyp boljak Regex API-iň iki amaly programmasyny görkezerin. 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