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ňizPattern
we 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 Pattern
we 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
Pattern
we Regex API Matcher
- PatternSyntaxException
ni 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ň mysalyPattern
, 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)
mazmunyregex
täze görnüşde saklanýan aralyk wekilçilige jemleýärPattern
. Bu usul ýa-da üstünlikli bolsa bir obýekte salgylanmany yzyna gaýtaryp berýär, ýa-daPatternSyntaxException
nädogry yzygiderli aňlatma sintaksis tapylsa kadadan çykma döredýär.Matcher
Bu obýekt tarapyndan ulanylan ýa-da yzyna gaýdyp gelen synpyň islendik obýektiPattern
, 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ýanPattern p = Pattern.compile("(?m)^\\.");
obýekt döredýär .Pattern
Pattern compile(String regex, int flags)
ýaly meseläni çözýärPattern compile(String regex)
, ýöne göz öňünde tutupflags
: 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ýänPattern
yzygiderliligi yglan edýär .CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINES
CASE_INSENSITIVE | DOTALL
flags
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.MULTILINE
we ýerleşdirilen baýdak aňlatmasy (?m)
şol bir zady edýär.
Pattern
Kä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ýärPattern
.int flags()
obýektiň baýdaklaryny görkezýärPattern
.
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 . Matcher
input
Pattern
Matcher
Matcher m = p.matcher(args[1]);
Matcher
Pattern
p
Bir gezeklik gözleg |
---|
static boolean matches(String regex, CharSequence input) Synp usuly obýektleri döretmekde we şablon ulanyp bir gezek gözlemekde Pattern tygş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 . Pattern Matcher input regex PatternSyntaxException System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only")); true all lowercase letters and whitespace only |
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. SynpPattern
iki ý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 .text
Pattern
text
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ällimit
. - 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.
- Oňyn baha gabat gelýär
- 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 synpdaPattern
bir 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, c
sü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ňMatcher
dü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 Matcher
dü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ň mysalynyRegexDemo
1-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ýarstart
. 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ýär1
(0-njy pozisiýa ähmiýet berilmeýär). Eger parametrdestart
negatiw baha ýa-da gabat gelýän tekstiň uzynlygyndan uly baha bar bolsa, bu usul kadadan çykma döredýärjava.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 kodPattern 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 tapawutlylykdamatches();
, ä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());
çykartrue
, sebäbi tekstiň başyabc!
diňe söz emele getirýän nyşanlardan durýar.
Pattern
synp obýektleri Matcher
dö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ýärMatcher
. Mysal üçin,m.reset();
salgylanyjy çözgüdi täzeden düzýärm
. -
Usul
Matcher reset(CharSequence text)
çözüjiniň ýagdaýyny täzeden düzýär we täze çözüji teksti düzýärtext
. Indiki nagyş gözleg işi täze matçer tekstiniň başynda başlaýar. Häzirki obýekte salgylanma görkezýärMatcher
. Mysal üçin,m.reset("new text");
salgylanylýan çözüjini täzeden düzýärm
we täze çözüji teksti düzýär"new text"
.
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ýärjava.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.StringBuffer
sb
String
replacement
StringBuffer
replacement
($)
-
Usul
StringBuffer appendTail(StringBuffer sb)
ähli teksti bir obýekte goşýarStringBuffer
we şol obýekte salgylanma berýär. Iň soňky usul jaňyndan soň , galan teksti obýekte göçürmekappendReplacement(StringBuffer sb, String replacement)
usulyna jaň ediň .appendTail(StringBuffer sb)
StringBuffer
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.IllegalStateException
kadadan çykma bolýar .IndexOutOfBoundsException
replacement
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. |
appendReplacement(StringBuffer sb, String replacement)
we usullaryny çagyrýar : appendTail(StringBuffer sb
cat
caterpillar
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 erpillar
her 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
SynpMatcher
bize 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ýärString
, gabat gelýän tekstiň ähli nyşanlaryny (birinji gabat gelýänçä) şu setire göçürýär, nyşanlary soňuna çenli goşýarreplacement
, galan nyşanlary setire göçürýär we yzyna gaýtaryp berýär obýektString
(setirdereplacement
dollar 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ýärString replaceFirst(String replacement)
, ýönereplacement
tapylan ähli gabat gelýänleri setirdäki simwollar bilen çalyşýar.
\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
GO TO FULL VERSION