Programmēšana

Regulāras izteiksmes Java, 1. daļa: Pattern matching un Pattern klase

Java rakstzīmju un virkņu virkņu klases piedāvā zema līmeņa atbalstu modeļu saskaņošanai, taču šis atbalsts parasti noved pie sarežģīta koda. Vienkāršākai un efektīvākai kodēšanai Java piedāvā Regex API. Šī divu daļu apmācība palīdzēs jums sākt darbu ar regulārajām izteiksmēm un Regex API. Vispirms mēs izpakosim trīs spēcīgās klases, kas dzīvo java.util.regex paketi, tad mēs izpētīsim Modelis klase un tās izsmalcinātie paraugu saskaņošanas konstrukcijas.

lejupielādēt Iegūt kodu Lejupielādējiet šajā apmācībā avota kodu, piemēram, lietojumprogrammām. Izveidoja Jeff Friesen JavaWorld.

Kas ir regulārie izteicieni?

A regulāra izteiksme, pazīstams arī kā a regex vai regexp, ir virkne, kuras modeli (veidne) apraksta virkņu kopu. Modelis nosaka, kuras virknes pieder kopai. Modelis sastāv no burtiskām rakstzīmēm un metahomas, kas ir rakstzīmes, kurām burtiskās nozīmes vietā ir īpaša nozīme.

Rakstu saskaņošana ir teksta meklēšanas process, lai identificētu sērkociņivai virknes, kas atbilst regulāras izteiksmes modelim. Java atbalsta modeļu saskaņošanu, izmantojot Regex API. API sastāv no trim klasēm -Modelis, Matcher, un PatternSyntaxException--visi atrodas java.util.regex iepakojums:

  • Modelis objekti, kas pazīstami arī kā modeļiem, ir apkopoti regexes.
  • Matcher objekti vai sērkociņi, ir dzinēji, kas interpretē modeļus, lai atrastu spēles rakstzīmju secības (objekti, kuru klases īsteno java.lang.CharSequence interfeisu un kalpo kā teksta avoti)
  • PatternSyntaxException objekti apraksta nelegālos regex modeļus.

Java nodrošina arī modeļu saskaņošanu, izmantojot dažādas metodes java.lang.Strings klasē. Piemēram, Būla spēles (virknes regex) atgriež patiesu tikai ja izsaucošā virkne precīzi sakrīt regexregex.

Ērtības metodes

Aizkadrā, spēles () un StīgaCitas uz regex orientētas ērtības metodes tiek ieviestas, izmantojot Regex API.

RegexDemo

Esmu izveidojis RegexDemo lietojumprogramma, lai parādītu Java regulārās izteiksmes un dažādās metodes, kas atrodas Modelis, Matcher, un PatternSyntaxException klases. Šeit ir demonstrācijas avota kods:

Uzskaitīšana 1. Regexes parādīšana

importēt java.util.regex.Matcher; importēt java.util.regex.Pattern; importēt java.util.regex.PatternSyntaxException; public class RegexDemo {public static void main (String [] args) {if (args.length! = 2) {System.err.println ("lietojums: java RegexDemo regex ievade"); atgriešanās; } // Pārveidot jaunu rindu (\ n) rakstzīmju secības par jaunu rindiņu rakstzīmēm. args [1] = args [1] .replaceAll ("\ n", "\ n"); mēģiniet {System.out.println ("regex =" + args [0]); System.out.println ("ievade =" + args [1]); Pattern p = Pattern.compile (args [0]); Matcher m = p.matcher (args [1]); while (m.find ()) System.out.println ("Atrasts [" + m.group () + "], sākot no" + m.start () + "un beidzot ar" + (m.end () - 1)); } catch (PatternSyntaxException pse) {System.err.println ("Slikta regex:" + pse.getMessage ()); System.err.println ("Apraksts:" + pse.getDescription ()); System.err.println ("Indekss:" + pse.getIndex ()); System.err.println ("Nepareizs modelis:" + pse.getPattern ()); }}}

Pirmā lieta RegexDemo's galvenais () metode ir apstiprināt tās komandrindu. Tam nepieciešami divi argumenti: pirmais arguments ir regex, bet otrais arguments ir ievades teksts, kas jāsaskaņo ar regex.

Iespējams, vēlēsities norādīt jaunu rindu (\ n) rakstzīmi kā daļu no ievades teksta. Vienīgais veids, kā to paveikt, ir norādīt a \ raksturs, kam seko an n raksturs. galvenais () pārveido šo rakstzīmju secību par Unicode vērtību 10.

Lielākā daļa RegexDemokods atrodas mēģiniet-noķert konstruēt. The mēģiniet bloks vispirms izvada norādīto regex un ievades tekstu un pēc tam izveido a Modelis objekts, kas saglabā apkopoto regex. (Regexes tiek apkopoti, lai uzlabotu veiktspēju modeļu saskaņošanas laikā.) No Modelis objekts un tiek izmantots, lai atkārtoti meklētu atbilstības, līdz neviens no tiem nepaliek. The noķert bloks izsauc dažādus PatternSyntaxException metodes, lai iegūtu noderīgu informāciju par izņēmumu. Pēc tam šī informācija tiek izvadīta.

Šajā brīdī jums nav jāzina vairāk par avota koda darbību; tas kļūs skaidrs, izpētot API 2. daļā. Tomēr jums ir jāapkopo 1. saraksts. Paņemiet kodu no 1. saraksta un pēc tam savai komandrindai ierakstiet šo RegexDemo:

javac RegexDemo.java

Raksts un tā konstrukcijas

Modelis, pirmā no trim klasēm, kas ietver Regex API, ir regulāras izteiksmes apkopots attēlojums. ModelisSDK dokumentācijā ir aprakstīti dažādi regulārā izteiksmes komponenti, taču, ja vien jūs jau neesat dedzīgs regex lietotājs, dokumentācijas daļas jūs varētu sajaukt. Kas ir kvantifikatori un kāda ir atšķirība mantkārīgs, negribīgi, un īpašnieks kvantifikatori? Kas ir raksturu klases, robežas sakritēji, atsauces uz aizmuguri, un iegulti karoga izteicieni? Es atbildēšu uz šiem un vairāk jautājumiem nākamajās sadaļās.

Burtiskās stīgas

Visvienkāršākā regex konstrukcija ir burtiskā virkne. Lai veiksmīga modeļa atbilstība būtu veiksmīga, kādai ievades teksta daļai jāatbilst šī konstrukta paraugam. Apsveriet šādu piemēru:

java RegexDemo ābolu sīklietotne

Šis piemērs mēģina atklāt, vai ir atbilstība ābolu modeli sīklietotne ievades teksts. Šī izeja atklāj atbilstību:

regex = ābolu ievade = sīklietotne Atrasts [ābols], sākot ar 0 un beidzot ar 4

Izvade parāda mums regulāro izteiksmi un ievades tekstu, pēc tam norāda uz veiksmīgu atbilstību ābolu ietvaros sīklietotne. Turklāt tas parāda attiecīgās spēles sākuma un beigu indeksus: 0 un 4, attiecīgi. Sākuma indekss identificē pirmo teksta vietu, kur notiek parauga atbilstība; beigu indekss identificē pēdējo spēles tekstu tekstu.

Tagad pieņemsim, ka mēs norādām šādu komandrindu:

java RegexDemo apple crabapple

Šoreiz mēs iegūstam šādu spēli ar dažādiem sākuma un beigu rādītājiem:

regex = apple input = crabapple Atrasts [ābols], sākot no 4 un beidzot ar 8

Pretējs scenārijs, kurā sīklietotne ir regex un ābolu ir ievades teksts, neatklāj nevienu atbilstību. Visam regulārajam izteicienam jāatbilst, un šajā gadījumā ievades tekstā nav a t pēc ābolu.

Metahomas

Spēcīgākas regex konstrukcijas apvieno burtiskās rakstzīmes ar metaharmām. Piemēram, a.b, perioda metacharacter (.) apzīmē jebkuru rakstzīmi, kas parādās starp a un b. Apsveriet šādu piemēru:

java RegexDemo .ox "Ātra brūna lapsa pārlec pāri slinkajam vērsim."

Šis piemērs norāda .c kā regex un Ātra brūnā lapsa pārlec pāri slinkajam vērsim. kā ievades tekstu. RegexDemo meklē tekstā atbilstības, kas sākas ar jebkuru rakstzīmi un beidzas ar vērsis. Tas rada šādu izvadi:

regex = .ox ievade = Ātra brūna lapsa pārlec pāri slinkajam vērsim. Atrasts [lapsa], kas sākas ar 16 un beidzas ar 18 Atrasts [vērsis], kas sākas ar 39 un beidzas ar 41

Rezultātā tiek atklātas divas atbilstības: lapsa un vērsis (ar vadošo kosmosa varoni). The . metacharacter atbilst f pirmajā mačā un kosmosa raksturs otrajā mačā.

Kas notiek, kad mēs nomainām .c ar perioda metacharacter? Tas ir, kāda izeja rodas, norādot šādu komandrindu:

java RegexDemo. - Ātra brūna lapsa pārlec pāri slinkajam vērsim.

Tā kā perioda metaraksts atbilst jebkuram rakstzīmei, RegexDemo izvada atbilstību katrai rakstzīmei (ieskaitot beigu perioda rakstzīmi) ievades tekstā:

regex =. ievade = Ātra brūna lapsa pārlec pāri slinkajam vērsim. Atrasts [T] sākas ar 0 un beidzas ar 0 Atrasts [h] sākas ar 1 un beidzas ar 1 Atrasts [e] sākas ar 2 un beidzas ar 2 Atrasts [] sākas ar 3 un beidzas ar 3 Atrasts [q] sākas ar 4 un beidzas ar 4 Atrasts [u] sākas ar 5 un beidzas ar 5 Atrasts [i] sākas ar 6 un beidzas ar 6 Atrasts [c] sākas ar 7 un beidzas ar 7 Atrasts [k] sākas ar 8 un beidzas ar 8 Atrasts [ ] sākas ar 9 un beidzas ar 9 Atrasts [b] sākas ar 10 un beidzas ar 10 Atrasts [r] sākas ar 11 un beidzas ar 11 Atrasts [o] sākas ar 12 un beidzas ar 12 Atrasts [w] sākas ar 13 un beidzas plkst. 13 Atrasts [n] sākas ar 14 un beidzas ar 14 Atrasts [] sākas ar 15 un beidzas ar 15 Atrasts [f] sākas ar 16 un beidzas ar 16 Atrasts [o] sākas ar 17 un beidzas ar 17 Atrasts [x] sākas 18 un beidzas 18 Atrasts [] sākas ar 19 un beidzas 19 Atrasts [j] sākas ar 20 un beidzas ar 20 Atrasts [u] sākas ar 21 un beidzas ar 21 Atrasts [m] sākas ar 22 un beidzas ar 22 Atrasts [p] sākas ar 23 un beidzas ar 23 Atrasts [s] st arting 24 un beidzas 24 Atrasts [] sākas ar 25 un beidzas 25 Atrasts [o] sākas ar 26 un beidzas ar 26 Atrasts [v] sākas ar 27 un beidzas ar 27 Atrasts [e] sākas ar 28 un beidzas ar 28 Atrasts [r] sākas ar 29 un beidzas ar 29 Atrasts [] sākas ar 30 un beidzas ar 30 Atrasts [t] sākas ar 31 un beidzas ar 31 Atrasts [h] sākas ar 32 un beidzas ar 32 Atrasts [e] sākas ar 33 un beidzas ar 33 Atrasts [] sākas ar 34 un beidzas ar 34 Atrasts [l] sākas ar 35 un beidzas ar 35 Atrasts [a] sākas ar 36 un beidzas ar 36 Atrasts [z] sākas ar 37 un beidzas ar 37 Atrasts [y ] sākas ar 38 un beidzas ar 38 Atrasts [] sākas ar 39 un beidzas ar 39 Atrasts [o] sākas ar 40 un beidzas ar 40 Atrasts [x] sākas ar 41 un beidzas ar 41 Atrasts [.] sākas ar 42 un beidzas ar 42

Citējot metarakstus

Lai precizētu . vai jebkuru meta raksturu kā burtisku raksturu regex konstrukcijā, citējiet metaharu vienā no šiem veidiem:

  • Pirms metacharacter ar slīpsvītru.
  • Novietojiet metacharacter starp \ Q un \ E (piem., \ Q. \ E).

Atcerieties dubultot katru slīpsvītras rakstzīmi (kā \\. vai Q), kas parādās virknes burtnīcā, piemēram, Virknes regex = "\.";. Nevajag dubultot slīpsvītras rakstzīmi, kad tā parādās kā daļa no komandrindas argumenta.

Rakstzīmju klases

Dažreiz mums jāierobežo rakstzīmes, kas radīs atbilstību noteiktai rakstzīmju kopai. Piemēram, mēs varētu meklēt patskaņus a, e, i, o, un u, kur jebkurš patskaņa gadījums norāda uz sakritību. A rakstura klase identificē rakstzīmju kopu starp kvadrātiekavām metarakstu ([ ]), palīdzot mums veikt šo uzdevumu. Modelis atbalsta vienkāršās, noliegšanas, diapazona, savienojuma, krustošanās un atņemšanas rakstzīmju klases. Mēs apskatīsim šos visus tālāk.

Vienkārša rakstzīmju klase

The vienkārša rakstzīmju klase sastāv no rakstzīmēm, kas izvietotas blakus, un atbilst tikai šīm rakstzīmēm. Piemēram, [abc] atbilst rakstzīmēm a, b, un c.

Apsveriet šādu piemēru:

java RegexDemo [csw] ala

Šis piemērs sakrīt tikai c ar savu kolēģi ala, kā parādīts šādā izvadā:

regex = [csw] input = ala Atrasta [c], sākot ar 0 un beidzot ar 0

Negācijas rakstzīmju klase

The negācijas rakstzīmju klase sākas ar ^ metacharacter un atbilst tikai tām rakstzīmēm, kas neatrodas šajā klasē. Piemēram, [^ abc] atbilst visām rakstzīmēm, izņemot a, b, un c.

Apsveriet šo piemēru:

java RegexDemo "[^ csw]" ala

Ņemiet vērā, ka dubultās pēdiņas ir nepieciešamas manai Windows platformai, kuras apvalks izturas pret ^ raksturs kā bēgšanas raksturs.

Šis piemērs sakrīt a, v, un e ar saviem kolēģiem ala, kā parādīts šeit:

regex = [^ csw] input = ala Atrasta [a] sākas ar 1 un beidzas ar 1 Atrasta [v] sākas ar 2 un beidzas ar 2 Atrasta [e] sākas ar 3 un beidzas ar 3

Diapazona rakstzīmju klase

The diapazona rakstzīmju klase sastāv no divām rakstzīmēm, kuras atdala defise metacharacter (-). Diapazonam pieder visas rakstzīmes, kas sākas ar rakstzīmi kreisajā pusē no defises un beidzas ar rakstzīmi defises labajā pusē. Piemēram, [a-z] atbilst visām mazo burtu alfabēta rakstzīmēm. Tas ir līdzvērtīgs precizēšanai [abcdefghijklmnopqrstuvwxyz].

Apsveriet šādu piemēru:

java RegexDemo [a-c] klauns

Šis piemērs sakrīt tikai c ar savu kolēģi klauns, kā parādīts:

regex = [a-c] ievade = klauns Atrasts [c], sākot ar 0 un beidzot ar 0

Vairāku diapazonu apvienošana

Varat apvienot vairākus diapazonus vienā diapazona rakstzīmju klasē, novietojot tos blakus. Piemēram, [a-zA-Z] atbilst visām mazo un lielo alfabēta rakstzīmēm.

Savienības rakstura klase

The savienības rakstura klase sastāv no vairākām ligzdotām rakstzīmju klasēm un atbilst visām rakstzīmēm, kas pieder izveidotajai savienībai. Piemēram, [a-d [m-p]] atbilst rakstzīmēm a cauri d un m cauri lpp.

Apsveriet šādu piemēru:

java RegexDemo [ab [c-e]] abcdef

Šis piemērs sakrīt a, b, c, d, un e ar saviem kolēģiem abcdef:

regex = [ab [ce]] input = abcdef Atrasts [a] sākas ar 0 un beidzas ar 0 Atrasts [b] sākas ar 1 un beidzas ar 1 Atrasts [c] sākas ar 2 un beidzas ar 2 Atrasts [d] sākas ar 3 un beidzas ar 3 Atrasts [e], sākot no 4 un beidzot ar 4

Krustojuma rakstzīmju klase

The krustojuma rakstzīmju klase sastāv no rakstzīmēm, kas kopīgas visām ligzdotajām klasēm, un atbilst tikai kopīgajām rakstzīmēm. Piemēram, [a-z && [d-f]] atbilst rakstzīmēm d, e, un f.

Apsveriet šādu piemēru:

java RegexDemo "[aeiouy && [y]]" ballīte

Ņemiet vērā, ka dubultās pēdiņas ir nepieciešamas manai Windows platformai, kuras apvalks izturas pret & rakstzīmi kā komandu atdalītāju.

Šis piemērs sakrīt tikai y ar savu kolēģi ballīte:

regex = [aeiouy && [y]] input = partija Atrasts [y], sākot no 4 un beidzot ar 4
$config[zx-auto] not found$config[zx-overlay] not found