Dom - Internet
Javascript regularni izrazi. replace() metoda s regularnim izrazom

Zadnja izmjena: 1.11.2015

Regularni izrazi predstavljaju uzorak koji se koristi za traženje ili modificiranje niza. Za rad s regularnim izrazima u JavaScriptu definiran je objekt RegExp.

Postoje dva načina za definiranje regularnog izraza:

Var myExp = /zdravo/; var myExp = new RegExp("zdravo");

Regularni izraz koji se ovdje koristi prilično je jednostavan: sastoji se od jedne riječi, "zdravo". U prvom slučaju, izraz se nalazi između dvije kose crte, au drugom slučaju se koristi RegExp konstruktor kojem se izraz prosljeđuje kao string.

RegExp metode

Kako bi se utvrdilo odgovara li regularni izraz nizu, objekt RegExp definira metodu test(). Ova metoda vraća true ako se niz podudara s regularnim izrazom, a false ako ne odgovara.

Var initialText = "zdravo svijete!"; var exp = /zdravo/; var rezultat = exp.test(initialText); document.write(rezultat + "
"); // true initialText = "beautifull wheather"; result = exp.test(initialText); document.write(result); // false - nema "zdravo" u retku početnog teksta

Metoda exec radi na sličan način - također provjerava odgovara li niz regularnom izrazu, samo što sada ova metoda vraća dio niza koji odgovara izrazu. Ako nema podudaranja, vraća se null.

Var initialText = "zdravo svijete!"; var exp = /zdravo/; var rezultat = exp.exec(initialText); document.write(rezultat + "
"); // zdravo initialText = "beautifull wheather"; result = exp.exec(initialText); document.write(result); // null

Grupe znakova

Regularni izraz ne sastoji se nužno od regularnih nizova, ali može uključivati ​​i posebne elemente sintakse regularnog izraza. Jedan takav element predstavljen je skupinama znakova u uglastim zagradama. Na primjer:

Var initialText = "defenzivnost"; var exp = /[abc]/; var rezultat = exp.test(initialText); document.write(rezultat + "
"); // istiniti početni tekst = "grad"; rezultat = exp.test(početni tekst); dokument.write(rezultat); // lažno

Izraz [abc] označava da niz mora imati jedno od tri slova.

Ako trebamo utvrditi prisutnost abecednih znakova iz određenog raspona u nizu, tada taj raspon možemo navesti jednom:

Var initialText = "defenzivnost"; var exp = /[a-z]/; var rezultat = exp.test(initialText); document.write(rezultat + "
"); // istiniti početni tekst = "3di0789"; rezultat = exp.test(početni tekst); dokument.write(rezultat); // lažno

U tom slučaju niz mora sadržavati barem jedan znak iz raspona a-z.

Ako, naprotiv, ne želite da redak ima samo određene znakove, tada trebate staviti znak ^ u uglate zagrade prije navođenja znakova:

Var initialText = "defenzivnost"; var exp = /[^a-z]/; var rezultat = exp.test(initialText); document.write(rezultat + "
"); // false initialText = "3di0789"; exp = /[^0-9]/; result = exp.test(initialText); document.write(result); // true

U prvom slučaju string ne bi trebao sadržavati samo znakove iz raspona a-z, ali kako se string "defensiveness" sastoji samo od znakova iz tog raspona, metoda test() vraća false, odnosno regularni izraz ne odgovara odvoditi.

U drugom slučaju ("3di0789") niz se ne smije sastojati samo od numeričkih znakova. Ali budući da niz također sadrži slova, niz odgovara regularnom izrazu, tako da test metoda vraća true.

Ako je potrebno, možemo prikupiti kombinacije izraza:

Var initialText = "home"; var exp = /[dt]o[nm]/; var rezultat = exp.test(initialText); document.write(rezultat); // istina

Izraz [dt]o[nm] označava one retke koji mogu sadržavati podstringove "house", "volume", "don", "ton".

Svojstva izraza

    Globalno svojstvo omogućuje vam da pronađete sve podnizove koji odgovaraju regularnom izrazu. Prema zadanim postavkama, pri traženju podnizova, regularni izraz odabire prvi podniz iz niza koji odgovara izrazu. Iako u nizu može postojati mnogo podnizova koji također odgovaraju izrazu. Da biste to učinili, koristite ovo svojstvo u obliku simbola g u izrazima

    Svojstvo ignoreCase omogućuje vam pronalaženje podnizova koji odgovaraju regularnom izrazu, bez obzira na velika i mala slova znakova u nizu. Da biste to učinili, znak i koristi se u regularnim izrazima

    Svojstvo multiline omogućuje vam pronalaženje podnizova koji odgovaraju regularnom izrazu u višerednom tekstu. Za to se u regularnim izrazima koristi simbol m

Na primjer:

Var initialText = "zdravo svijetu"; var exp = /svijet/; var rezultat = exp.test(initialText); // lažno

Ovdje nema podudaranja između niza i izraza, budući da se "Svijet" razlikuje od "svijeta" u velikim i malim slovima. U ovom slučaju trebate promijeniti regularni izraz dodavanjem svojstva ignoreCase:

Var exp = /world/i;

Pa, također možemo koristiti nekoliko svojstava odjednom.

Klasa RegExp u JavaScriptu je regularni izraz - objekt koji opisuje uzorak znakova. Objekti RegExp obično se stvaraju korištenjem posebne sintakse literala predstavljene u nastavku, ali se mogu izraditi i pomoću konstruktora RegExp().

Sintaksa

// koristeći posebnu sintaksu literala var regex = /uzorak /zastavice; // korištenjem konstruktora var regex = new RegExp("uzorak ", "zastavice"); var regex = new RegExp(/pattern /, "flags ");

Vrijednosti parametara:

Oznake regularnog izraza

ZastavaOpis
gOmogućuje vam pronalaženje svih podudaranja umjesto zaustavljanja nakon prvog podudaranja ( globalna zastava utakmice).
jaOmogućuje podudaranje bez obzira na velika i mala slova ( ignoriraj oznaku velikih i malih slova).
mUsklađivanje se vrši u više redaka. Početni i završni znakovi (^ i $) obrađuju se u više redaka, što znači da se podudaranje pojavljuje na početku ili kraju svakog retka (razdjelnici \n ili \r), a ne samo na početku ili kraju cijelog retka ( višelinijska zastavica).
uUzorak će se tumačiti kao niz Unicode kodnih točaka ( unicode zastavica).
gUparivanje se događa na indeksu na koji ukazuje svojstvo lastIndex ovog regularnog izraza, dok se uparivanje ne izvodi na kasnijem ili ranijem indeksu ( ljepljiva zastavica).

Skupovi znakova

Metakarakteri

SimbolOpis
. Omogućuje vam da pronađete jedan znak koji nije znak za novi red ili kraj retka (\n, \r, \u2028 ili \u2029).
\dOmogućuje vam da pronađete simbol broja u osnovnoj latinici. Ekvivalentno korištenju skupa znakova.
\DOmogućuje vam da pronađete bilo koji znak koji nije broj u osnovnoj latiničnoj abecedi. Ekvivalent skupu znakova [^0-9].
\sOmogućuje vam da pronađete jedan razmak. Razmak se odnosi na razmak, tabulator, pomak stranice, pomak u redak i druge Unicode znakove razmaka. Ekvivalent skupu znakova [\f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\ u200a​ \u2028\u2029​\u202f\u205f​\u3000].
\SOmogućuje vam da pronađete jedan znak koji nije razmak. Razmak se odnosi na razmak, tabulator, pomak stranice, pomak u redak i druge Unicode znakove razmaka. Ekvivalent skupu znakova [^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009 \u200a ​\u2028\u2029​\u202f\u205f​\u3000].
[\b]Omogućuje vam da pronađete znak povratnice (poseban znak \b, U+0008).
\0 Omogućuje vam da pronađete simbol 0 (nula).
\nOmogućuje vam da pronađete znak za novi red.
\fOmogućuje vam pronalaženje znaka feeda stranice.
\rOmogućuje vam da pronađete znak za povratak na početak reda.
\tOmogućuje vam pronalaženje horizontalnog tabulatorskog znaka.
\vOmogućuje vam da pronađete znak okomite kartice.
\wOmogućuje vam da pronađete bilo koji alfanumerički znak u osnovnoj latinici, uključujući podvlake. Ekvivalent skupu znakova.
\WOmogućuje vam da pronađete bilo koji znak koji nije znak iz osnovne latinične abecede. Ekvivalent skupu znakova [^a-Za-z0-9_].
\cXOmogućuje vam da pronađete kontrolni znak u nizu. Gdje je X slovo od A do Z. Na primjer, /\cM/ predstavlja znak Ctrl-M.
\xhhOmogućuje vam da pronađete znak koristeći heksadecimalnu vrijednost (hh je dvoznamenkasta heksadecimalna vrijednost).
\uhhhhOmogućuje vam da pronađete znak pomoću UTF-16 kodiranja (hhhh je četveroznamenkasti heksadecimalni broj).
\u(hhhh) ili
\u(hhhhh)
Omogućuje vam da pronađete znak s Unicode vrijednošću U+hhhh ili U+hhhhh (heksadecimalna vrijednost). Samo kada je dana zastavica u.
\ Označava da je sljedeći znak poseban i da ga ne treba tumačiti doslovno. Za znakove koji se obično tumače na poseban način, navodi da sljedeći znak nije poseban i treba ga tumačiti doslovno.

Ograničenja

Kvantifikatori

SimbolOpis
n*Podudaranje se pojavljuje na bilo kojem nizu koji sadrži nula ili više pojavljivanja znaka n.
n+Uparivanje se događa s bilo kojim nizom koji sadrži barem jedan znak n.
n?Podudaranje se događa na bilo kojem nizu s prethodnim elementom n nula ili jednom.
n(x)Odgovara bilo kojem nizu koji sadrži niz znakova n određeni broj puta x. x
n(x,) x pojave prethodnog elementa n. x mora biti pozitivan cijeli broj.
n(x, y)Podudara se s bilo kojim nizom koji sadrži najmanje x, ali ne više od sa g pojave prethodnog elementa n. x I g moraju biti pozitivni cijeli brojevi.
n*?
n+?
n??
n(x)?
n(x,)?
n(x,y)?
Usporedba se odvija po analogiji s kvantifikatorima *, +, ? i (...), međutim, traži se minimalna moguća usporedba. Zadani je način rada "pohlepan", ? na kraju kvantifikatora omogućuje vam postavljanje "nepohlepnog" načina rada u kojem se usporedba ponavlja najmanji mogući broj puta.
x(?=y)Omogućuje vam usporedbu x, samo ako je za x trebao bi g.
x(?!y)Omogućuje vam usporedbu x, samo ako je za x nemoj to učiniti g.
x|yUsporedba se događa s bilo kojom od navedenih alternativa.

Grupiranje i povratne veze

SimbolOpis
(x)Omogućuje vam da pronađete simbol x i zapamtite rezultat usporedbe ("hvatanje zagrada"). Podudarni podniz može se pozvati iz rezultirajućih elemenata niza ..., [n] ili iz svojstava unaprijed definiranog RegExp objekta $1 ..., $9.
(?:x)Omogućuje vam da pronađete simbol x, ali ne pamti rezultat utakmice ("nehvatajuće zagrade"). Podudarni podniz ne može se pozvati iz rezultirajućih elemenata niza ..., [n] ili iz svojstava unaprijed definiranog RegExp objekta $1 ..., $9.
\nPovratna referenca na posljednji podniz koji odgovara n-tom u zagradama u regularnom izrazu (numeriranje zagrada ide slijeva na desno). n mora biti pozitivan cijeli broj.

Neki ljudi, kada se suoče s problemom, pomisle: "Oh, upotrijebit ću regularne izraze." Sada imaju dva problema.
Jamie Zawinski

Yuan-Ma je ​​rekao: “Potrebno je puno sile da se drvo prereže poprečno. Potrebno je puno koda za programiranje preko strukture problema.
Učitelj Yuan-Ma, “Knjiga programiranja”

Alati i tehnike programiranja opstaju i šire se na kaotičan evolucijski način. Ponekad ne prežive oni lijepi i briljantni, već jednostavno oni koji dovoljno dobro rade u svom području – primjerice, ako su integrirani u drugu uspješnu tehnologiju.

U ovom poglavlju raspravljat ćemo o takvom alatu - regularnim izrazima. Ovo je način za opisivanje uzoraka u podacima niza. Oni stvaraju mali, samostalni jezik koji je uključen u JavaScript i mnoge druge jezike i alate.

Redovni rasporedi su i vrlo čudni i iznimno korisni. Njihova je sintaksa zagonetna, a JavaScript programsko sučelje nezgrapno. Ali to je moćan alat za istraživanje i manipuliranje nizovima. Nakon što ih shvatite, postat ćete učinkovitiji programer.

Stvaranje regularnog izraza

Regular – vrsta objekta. Može se izraditi pozivom RegExp konstruktora ili pisanjem željenog predloška, ​​okruženog kosim crtama.

Var re1 = novi RegExp("abc"); var re2 = /abc/;

Oba ova regularna izraza predstavljaju isti obrazac: znak "a" nakon kojeg slijedi znak "b" nakon kojeg slijedi znak "c".

Ako koristite RegExp konstruktor, tada se uzorak piše kao uobičajeni niz, tako da se primjenjuju sva pravila koja se odnose na obrnute kose crte.

Drugi unos, gdje je uzorak između kosih crta, drugačije tretira obrnute kose crte. Prvo, budući da uzorak završava kosom crtom, moramo staviti obrnutu kosu crtu ispred kose crte koju želimo uključiti u naš uzorak. Osim toga, obrnute kose crte koje nisu dio posebnih znakova poput \n bit će sačuvane (umjesto zanemarene kao u nizovima) i promijenit će značenje uzorka. Neki znakovi, poput upitnika ili plusa, imaju posebno značenje u regularnim izrazima, a ako trebate pronaći takav znak, ispred njega također mora stajati obrnuta kosa crta.

Var osamnaestPlus = /osamnaest\+/;

Da biste znali ispred kojih znakova mora stajati kosa crta, morate naučiti popis svih posebnih znakova u regularnim izrazima. To još nije moguće, pa ako ste u nedoumici, samo stavite obrnutu kosu crtu ispred bilo kojeg znaka koji nije slovo, broj ili razmak.

Provjera podudarnosti

Redoviti korisnici imaju nekoliko metoda. Najjednostavniji je test. Ako mu proslijedite niz, vratit će Booleovu vrijednost koja pokazuje sadrži li niz pojavljivanje zadanog uzorka.

Console.log(/abc/.test("abcde")); // → istina console.log(/abc/.test("abxde")); // → lažno

Pravilni niz koji se sastoji samo od nespecijalnih znakova jednostavno je niz ovih znakova. Ako je abc bilo gdje u retku koji testiramo (ne samo na početku), test će vratiti true.

Tražite skup znakova

Također možete saznati sadrži li niz abc pomoću indexOf. Uobičajeni uzorci omogućuju vam da idete dalje i stvorite složenije uzorke.

Recimo da trebamo pronaći bilo koji broj. Kada u regularnom izrazu stavimo skup znakova u uglate zagrade, to znači da taj dio izraza odgovara bilo kojem od znakova u zagradama.

Oba izraza su u redovima koji sadrže broj.

Console.log(//.test("1992")); // → istina console.log(//.test("1992.")); // → istina

U uglatim zagradama, crtica između dva znaka koristi se za određivanje raspona znakova, gdje je niz određen Unicode kodiranjem. Znakovi od 0 do 9 nalaze se samo u nizu (kodovi od 48 do 57), tako da ih sve hvata i odgovara bilo kojem broju.

Nekoliko grupa znakova ima vlastite ugrađene kratice.

\d Bilo koji broj
\w Alfanumerički znak
\s Znak razmaka (razmak, tabulator, novi red, itd.)
\D nije broj
\W nije alfanumerički znak
\S nije znak razmaka
. bilo koji znak osim pomicanja retka

Dakle, možete postaviti format datuma i vremena kao što je 01/30/2003 15:20 sa sljedećim izrazom:

Var dateTime = /\d\d-\d\d-\d\d\d\d \d\d:\d\d/; console.log(dateTime.test("30-01-2003 15:20")); // → istina console.log(dateTime.test("30. siječnja 2003. 15:20")); // → lažno

Izgleda užasno, zar ne? Ima previše obrnutih kosih crta, što čini uzorak teškim za razumijevanje. Kasnije ćemo ga malo poboljšati.

Obrnute kose crte također se mogu koristiti u uglatim zagradama. Na primjer, [\d.] znači bilo koji broj ili točku. Primijetite da točka unutar uglatih zagrada gubi svoje posebno značenje i postaje jednostavno točka. Isto vrijedi i za druge posebne znakove, kao što je +.

Možete invertirati skup znakova - to jest, reći da trebate pronaći bilo koji znak osim onih koji su u skupu - stavljanjem znaka ^ odmah iza početne uglate zagrade.

Var notBinary = /[^01]/; console.log(notBinary.test("1100100010100110")); // → false console.log(notBinary.test("1100100010200110")); // → istina

Ponavljanje dijelova predloška

Znamo kako pronaći jedan broj. Što ako trebamo pronaći cijeli broj - niz od jedne ili više znamenki?

Ako stavite znak + iza nečega u redovnom nizu, to će značiti da se taj element može ponoviti više puta. /\d+/ znači jednu ili više znamenki.

Console.log(/"\d+"/.test(""123"")); // → istina console.log(/"\d+"/.test("""")); // → false console.log(/"\d*"/.test(""123"")); // → istina console.log(/"\d*"/.test("""")); // → istina

Zvjezdica * ima gotovo isto značenje, ali dopušta da se uzorak pojavi nula puta. Ako iza nečega slijedi zvjezdica, to nikada ne sprječava da uzorak bude u retku - samo se tamo pojavljuje nula puta.

Upitnik čini dio uzorka neobveznim, što znači da se može pojaviti nula ili jednom. U sljedećem primjeru, znak u se može pojaviti, ali uzorak se podudara čak i kada se ne podudara.

Var susjed = /neighbou?r/; console.log(neighbor.test("neighbor")); // → istina console.log(neighbor.test("neighbor")); // → istina

Vitičaste zagrade koriste se za određivanje točnog broja puta kada se uzorak mora pojaviti. (4) iza elementa znači da se mora pojaviti 4 puta u retku. Također možete odrediti prazninu: (2,4) znači da se element mora pojaviti najmanje 2 i ne više od 4 puta.

Druga verzija formata datuma i vremena, gdje su dopušteni dani, mjeseci i sati s jednom ili dvije znamenke. A također je i malo čitljiviji.

Var dateTime = /\d(1,2)-\d(1,2)-\d(4) \d(1,2):\d(2)/; console.log(dateTime.test("30-1-2003 8:45")); // → istina

Otvorene razmake možete koristiti izostavljanjem jednog od brojeva. (,5,) znači da se obrazac može pojaviti od nula do pet puta, a (5,) znači od pet ili više puta.

Grupiranje podizražaja

Za upotrebu operatora * ili + na više elemenata odjednom, možete koristiti zagrade. Dio regularnog izraza u zagradama smatra se jednim elementom sa stajališta operatora.

Var cartoonCrying = /boo+(hoo+)+/i; console.log(cartoonCrying.test("Boohoooohoohooo")); // → istina

Prvi i drugi plus odnose se samo na drugo o u boo i hoo. Treći + odnosi se na cijelu grupu (hoo+), pronalaženje jedne ili više takvih sekvenci.

Slovo i na kraju izraza čini regularni izraz neosjetljivim na velika i mala slova - tako da B odgovara b.

Utakmice i grupe

Test metoda je najjednostavnija metoda za provjeru regularnih izraza. Ono vam samo govori je li pronađeno podudaranje ili ne. Regulari također imaju exec metodu, koja će vratiti null ako ništa nije pronađeno, a inače će vratiti objekt s informacijama o podudaranju.

Var match = /\d+/.exec("jedan dva 100"); konzola.log(podudaranje); // → ["100"] console.log(match.index); // → 8

Objekt koji vraća exec ima svojstvo indeksa koje sadrži broj znaka iz kojeg je došlo do podudaranja. Općenito, objekt izgleda kao niz nizova, gdje je prvi element niz za koji je provjereno da se podudara. U našem primjeru, ovo će biti niz brojeva koje smo tražili.

Nizovi imaju metodu podudaranja koja radi na gotovo isti način.

Console.log("jedan dva 100".match(/\d+/)); // → ["100"]

Kada regularni izraz sadrži podizraze grupirane u zagradama, tekst koji odgovara tim grupama također će se pojaviti u nizu. Prvi element uvijek se potpuno podudara. Drugi je dio koji odgovara prvoj skupini (onoj čije su se zagrade prve pojavile), zatim drugoj skupini i tako dalje.

VarquotedText = /"([^"]*)"/; console.log(quotedText.exec("ona je rekla "zdravo"")); // → [""zdravo"", "zdravo"]

Kada grupa uopće nije pronađena (na primjer, ako je iza nje upitnik), njezina pozicija u nizu je nedefinirana. Ako se grupa podudara nekoliko puta, tada će samo zadnje podudaranje biti u nizu.

Console.log(/bad(ly)?/.exec("bad")); // → ["loše", nedefinirano] console.log(/(\d)+/.exec("123")); // → ["123", "3"]

Grupe su korisne za dohvaćanje dijelova nizova. Ako ne želimo samo provjeriti ima li niz datum, već ga ekstrahirati i stvoriti objekt koji predstavlja datum, možemo staviti niz brojeva u zagrade i odabrati datum iz rezultata exec.

Ali prvo, mala digresija u kojoj ćemo naučiti preferirani način pohranjivanja datuma i vremena u JavaScriptu.

Vrsta datuma

JavaScript ima standardnu ​​vrstu objekta za datume—točnije, trenutke u vremenu. Zove se Datum. Ako jednostavno kreirate objekt datuma koristeći new, dobit ćete trenutni datum i vrijeme.

Console.log(novi datum()); // → Ned, 9. studenog 2014. 00:07:57 GMT+0300 (CET)

Također možete stvoriti objekt koji sadrži određeno vrijeme

Console.log(novi datum(2015, 9, 21)); // → Srijeda, 21. listopada 2015. 00:00:00 GMT+0300 (CET) console.log(novi datum(2009, 11, 9, 12, 59, 59, 999)); // → srijeda, 9. prosinca 2009. 12:59:59 GMT+0300 (CET)

JavaScript koristi konvenciju prema kojoj brojevi mjeseci počinju s nulom, a brojevi dana s jedinicom. Ovo je glupo i smiješno. Budi oprezan.

Zadnja četiri argumenta (sati, minute, sekunde i milisekunde) nisu obavezna i postavljaju se na nulu ako nedostaju.

Vremenske oznake pohranjuju se kao broj milisekundi koje su prošle od početka 1970. Za vremena prije 1970. koriste se negativni brojevi (to je zbog konvencije vremena Unixa koja je stvorena otprilike u to vrijeme). Metoda getTime objekta datuma vraća ovaj broj. Prirodno je velik.
console.log(novi datum(2013, 11, 19).getTime()); // → 1387407600000 console.log(novi datum(1387407600000)); // → čet, 19. prosinca 2013. 00:00:00 GMT+0100 (CET)

Ako konstruktoru datuma date jedan argument, on se tretira kao ovaj broj milisekundi. Trenutnu vrijednost milisekunde možete dobiti stvaranjem objekta Date i pozivanjem metode getTime ili pozivanjem funkcije Date.now.

Objekt Date ima metode getFullYear, getMonth, getDate, getHours, getMinutes i getSeconds za dohvaćanje njegovih komponenti. Postoji i metoda getYear koja vraća prilično beskoristan dvoznamenkasti kod poput 93 ili 14.

Stavljanjem relevantnih dijelova predloška u zagrade, možemo stvoriti datumski objekt izravno iz niza.

Funkcija findDate(string) ( var dateTime = /(\d(1,2))-(\d(1,2))-(\d(4))/; var match = dateTime.exec(string); return novi Datum(Broj(podudaranje), Broj(podudaranje) - 1, Broj(podudaranje)); ) console.log(findDate("30-1-2003")); // → čet, 30. siječnja 2003. 00:00:00 GMT+0100 (CET)

Granice riječi i redaka

Nažalost, findDate će jednako sretno izvući besmisleni datum 00-1-3000 iz niza "100-1-30000". Podudaranje se može dogoditi bilo gdje u nizu, tako da će u ovom slučaju jednostavno započeti na drugom znaku i završiti na pretposljednjem znaku.

Ako trebamo prisiliti podudaranje da uzme cijeli niz, koristimo oznake ^ i $. ^ odgovara početku retka, a $ kraju. Stoga, /^\d+$/ odgovara nizu koji sadrži samo jednu ili više znamenki, /^!/ odgovara nizu koji počinje s uskličnikom, a /x^/ ne odgovara nijednom nizu (ne može biti x).

Ako, s druge strane, samo želimo biti sigurni da datum počinje i završava na granici riječi, koristimo oznaku \b. Granica riječi može biti početak ili kraj retka ili bilo koje mjesto u retku gdje se s jedne strane nalazi alfanumerički znak \w, a s druge strane nealfanumerički znak.

Console.log(/cat/.test("concatenate")); // → true console.log(/\bcat\b/.test("concatenate")); // → lažno

Imajte na umu da oznaka granice nije simbol. To je jednostavno ograničenje, što znači da se podudaranje događa samo ako je ispunjen određeni uvjet.

Predlošci s izborom

Recimo da trebate saznati sadrži li tekst ne samo broj, već broj iza kojeg slijedi svinja, krava ili kokoš u jednini ili množini.

Bilo bi moguće napisati tri regularna izraza i provjeriti ih jedan po jedan, ali postoji bolji način. Simbol | označava izbor između uzoraka lijevo i desno od njega. I možemo reći sljedeće:

Var animalCount = /\b\d+ (svinja|krava|kokoš)s?\b/; console.log(animalCount.test("15 svinja")); // → istina console.log(animalCount.test("15 pigchickens")); // → lažno

Zagrade ograničavaju dio uzorka na koji se | primjenjuje, a mnogi takvi operatori mogu se postaviti jedan za drugim kako bi označili izbor između više od dvije opcije.

Pretraživač

Regularni izrazi mogu se smatrati dijagramima toka. Sljedeći dijagram opisuje nedavni primjer stoke.

Izraz odgovara nizu ako je moguće pronaći put od lijeve strane dijagrama do desne. Pamtimo trenutnu poziciju u retku i svaki put kada prolazimo kroz pravokutnik provjeravamo da dio retka odmah iza naše pozicije u njemu odgovara sadržaju pravokutnika.

To znači da provjera podudaranja našeg uobičajenog znaka u nizu "3 praseta" prilikom prolaska kroz dijagram toka izgleda ovako:

Na poziciji 4 nalazi se granica riječi, a prolazimo prvi pravokutnik
- počevši od 4. pozicije nalazimo broj i prolazimo kroz drugi pravokutnik
- na poziciji 5 jedna se staza zatvara natrag ispred drugog pravokutnika, a druga ide dalje do pravokutnika s razmakom. Imamo prostor, a ne broj i biramo drugi put.
- sada smo na poziciji 6, početak “svinja”, i na trostrukom odvojku staza. U nizu nema “krave” ili “kokoši”, ali ima “svinje” pa biramo ovaj put.
- na poziciji 9 nakon trostrukog račvanja jedna staza zaobilazi “s” i ide do pravokutnika granice posljednje riječi, a druga ide kroz “s”. Imamo "s" pa idemo tamo.
- na poziciji 10 nalazimo se na kraju retka i samo granica riječi može odgovarati. Kraj linije se smatra granicom, a prolazimo kroz posljednji pravokutnik. I sada smo uspješno pronašli naš predložak.

U osnovi, regularni izrazi funkcioniraju tako da algoritam počinje na početku niza i tamo pokušava pronaći podudaranje. U našem slučaju, postoji granica riječi, pa prolazi prvi pravokutnik - ali tamo nema broja, pa se spotiče o drugi pravokutnik. Zatim se pomiče na drugi znak u nizu i pokušava tamo pronaći podudaranje... I tako dalje dok ne pronađe podudaranje ili ne dođe do kraja niza, u kojem slučaju nije pronađeno podudaranje.

Provizije

Regularni izraz /\b(+b|\d+|[\da-f]h)\b/ odgovara ili binarnom broju iza kojeg slijedi b, decimalnom broju bez sufiksa ili heksadecimalnom broju (brojevi od 0 do 9 ili simboli od a do h), a zatim h. Relevantni dijagram:

Prilikom traženja podudaranja može se dogoditi da algoritam krene gornjom stazom (binarni broj), čak i ako u nizu nema takvog broja. Ako postoji redak “103”, na primjer, jasno je da će tek nakon što dođe do broja 3 algoritam shvatiti da je na krivom putu. Općenito, linija odgovara redovnom nizu, samo ne u ovoj temi.

Tada se algoritam vraća natrag. Na račvanju pamti trenutnu poziciju (u našem slučaju to je početak retka, odmah iza granice riječi) tako da se možete vratiti i pokušati drugim putem ako odabrani ne radi. Za niz “103”, nakon što naiđe na trojku, vratit će se i pokušati proći kroz decimalni put. Ovo će funkcionirati pa će se pronaći podudaranje.

Algoritam se zaustavlja čim pronađe potpuno podudaranje. To znači da čak i ako je nekoliko opcija prikladno, koristi se samo jedna od njih (redoslijedom kojim se pojavljuju u redovnom nizu).

Vraćanje se događa kada se koriste operatori ponavljanja kao što su + i *. Ako tražite /^.*x/ u nizu "abcxe", regex dio.* će pokušati iskoristiti cijeli niz. Algoritam će tada shvatiti da treba i "x". Budući da nema "x" nakon kraja niza, algoritam će pokušati potražiti podudaranje pomicanjem za jedan znak unatrag. Nakon abcx također nema x, zatim se ponovno vraća, ovaj put na podniz abc. I nakon retka, pronalazi x i prijavljuje uspješno podudaranje, na pozicijama od 0 do 4.

Možete napisati redovitu rutinu koja će dovesti do višestrukih vraćanja. Ovaj se problem pojavljuje kada se uzorak može podudarati s unosom na mnogo različitih načina. Na primjer, ako pogriješimo prilikom pisanja regularnog izraza za binarne brojeve, mogli bismo slučajno napisati nešto poput /(+)+b/.

Kad bi algoritam tražio takav uzorak u dugom nizu 0 i 1 koji nema "b" na kraju, prvo bi prošao kroz unutarnju petlju dok ne bi ostao bez znamenki. Tada će primijetiti da nema “b” na kraju, vratit će se jednu poziciju unatrag, proći kroz vanjsku petlju, opet odustati, pokušati se vratiti na drugu poziciju po unutarnjoj petlji... I nastavit će za pretraživanje na ovaj način, koristeći obje petlje. Odnosno, količina rada sa svakim znakom retka će se udvostručiti. Čak i za nekoliko desetaka znakova, pronalaženje podudaranja trajat će jako dugo.

način zamjene

Nizovi imaju metodu zamjene koja može zamijeniti dio niza drugim nizom.

Console.log("tata".replace("p", "m")); // → karta

Prvi argument također može biti regularni izraz, u kojem slučaju se prvo pojavljivanje regularnog izraza u retku zamjenjuje. Kada se regularnom izrazu doda opcija “g” (globalno), zamjenjuju se sva pojavljivanja, a ne samo prva

Console.log("Borobudur".replace(//, "a")); // → Barobudur console.log("Borobudur".replace(//g, "a")); // → Barabadar

Imalo bi smisla proslijediti opciju "zamijeni sve" kroz zasebni argument ili kroz posebnu metodu kao što je replaceAll. No, nažalost, opcija se prenosi kroz sam redovni sustav.

Puna snaga regularnih izraza otkriva se kada koristimo veze na grupe koje se nalaze u nizu, specificirane u regularnom izrazu. Na primjer, imamo redak koji sadrži imena ljudi, jedno ime po retku, u formatu "Prezime, Ime". Ako ih trebamo zamijeniti i ukloniti zarez da bismo dobili "Ime Prezime", pišemo sljedeće:

Console.log("Hopper, Grace\nMcCarthy, John\nRitchie, Dennis" .replace(/([\w ]+), ([\w ]+)/g, "$2 $1")); // → Grace Hopper // John McCarthy // Dennis Ritchie

$1 i $2 u zamjenskom retku odnose se na grupe znakova unutar zagrada. $1 se zamjenjuje tekstom koji odgovara prvoj grupi, $2 drugom grupom i tako dalje, do $9. Cijelo podudaranje sadržano je u varijabli $&.

Također možete proslijediti funkciju kao drugi argument. Za svaku zamjenu bit će pozvana funkcija čiji će argumenti biti pronađene grupe (i cijeli odgovarajući dio retka), a njezin rezultat bit će umetnut u novi red.

Jednostavan primjer:

Var s = "CIA i FBI"; console.log(s.replace(/\b(fbi|cia)\b/g, function(str) ( return str.toUpperCase(); ))); // → CIA i FBI

Evo jednog zanimljivijeg:

Var stock = "1 limun, 2 kupusa i 101 jaje"; funkcija minusOne(podudaranje, iznos, jedinica) ( iznos = Broj(iznos) - 1; if (iznos == 1) // preostaje samo jedan, uklonite "s" na kraju unit = unit.slice(0, unit. duljina - 1); inače ako (iznos == 0) iznos = "ne"; vrati iznos + " " + jedinica; ) console.log(stock.replace(/(\d+) (\w+)/g, minusOne) ); // → bez limuna, 1 kupus i 100 jaja

Kod uzima niz, pronalazi sva pojavljivanja brojeva iza kojih slijedi riječ i vraća niz sa svakim brojem smanjenim za jedan.

Grupa (\d+) ide u argument količine, a (\w+) ide u argument jedinice. Funkcija pretvara iznos u broj - i to uvijek radi, jer je naš obrazac \d+. A zatim mijenja riječ, u slučaju da je preostala samo 1 stavka.

Pohlepa

Lako je koristiti replace za pisanje funkcije koja uklanja sve komentare iz JavaScript koda. Evo prvog pokušaja:

Funkcija stripComments(code) ( return code.replace(/\/\/.*|\/\*[^]*\*\//g, ""); ) console.log(stripComments("1 + /* 2 */3")); // → 1 + 3 console.log(stripComments("x = 10;// deset!")); // → x = 10; console.log(stripComments("1 /* a */+/* b */ 1")); // → 1 1

Dio prije operatora "ili" odgovara dvjema kosim crtama nakon kojih slijedi bilo koji broj znakova osim novih redaka. Dio koji uklanja višeredne komentare je složeniji. Koristimo [^], tj. bilo koji znak koji nije prazan kao način da se pronađe bilo koji znak. Ne možemo koristiti točku jer se blok komentari nastavljaju u novom retku, a znak novog retka ne odgovara točki.

Ali rezultat prethodnog primjera nije točan. Zašto?

Dio [^]* prvo će pokušati uhvatiti što više znakova. Ako zbog toga sljedeći dio regularnog niza ne pronađe podudaranje, vratit će jedan znak unatrag i pokušati ponovno. U primjeru, algoritam pokušava uhvatiti cijelu liniju, a zatim se vraća natrag. Vrativši 4 znaka unatrag, pronaći će */ u retku - a to nije ono što smo htjeli. Htjeli smo uhvatiti samo jedan komentar, a ne ići na kraj retka i pronaći posljednji komentar.

Zbog toga kažemo da su operatori ponavljanja (+, *, ? i ()) pohlepni, što znači da prvo zgrabe što više mogu, a zatim se vrate. Ako postavite pitanje nakon ovakvog operatora (+?, *?, ??, ()?), oni će se pretvoriti u nepohlepne i početi pronalaziti najmanje moguće pojavljivanja.

A to je ono što nam treba. Prisiljavanjem zvjezdice da pronađe podudaranja u minimalnom mogućem broju znakova u retku, trošimo samo jedan blok komentara, i ništa više.

Funkcija stripComments(code) ( return code.replace(/\/\/.*|\/\*[^]*?\*\//g, ""); ) console.log(stripComments("1 /* a */+/* b */ 1")); // → 1 + 1

Mnoge se pogreške pojavljuju kada se koriste pohlepni operatori umjesto onih koji nisu pohlepni. Kada koristite operator ponavljanja, uvijek prvo razmislite o nepohlepnom operatoru.

Dinamičko stvaranje RegExp objekata

U nekim slučajevima, točan uzorak je nepoznat u trenutku kada je kod napisan. Na primjer, morat ćete potražiti ime korisnika u tekstu i staviti ga u podvlaku. Budući da ćete ime znati tek nakon pokretanja programa, ne možete koristiti kosu crtu.

Ali možete konstruirati niz i koristiti RegExp konstruktor. Evo primjera:

Var name = "harry"; var text = "A Harry ima ožiljak na čelu."; var regexp = new RegExp("\\b(" + name + ")\\b", "gi"); console.log(text.replace(regexp, "_$1_")); // → A _Harry_ ima ožiljak na čelu.

Kada stvaramo granice riječi, moramo koristiti dvostruke kose crte jer ih pišemo u normalnom retku, a ne u pravilnom nizu s kosim crtama naprijed. Drugi argument za RegExp sadrži opcije za regularne izraze - u našem slučaju "gi", tj. globalno i neosjetljivo na velika i mala slova.

Ali što ako je ime “dea+hlrd” (ako je naš korisnik kulhatzker)? Kao rezultat, dobit ćemo besmisleni regularni izraz koji neće pronaći podudaranja u nizu.

Možemo dodati obrnute kose crte prije bilo kojeg znaka koji nam se ne sviđa. Ne možemo dodati obrnute kose crte prije slova jer su \b ili \n posebni znakovi. Ali možete bez problema dodati kose crte ispred bilo kojeg nealfanumeričkog znaka.

Var name = "dea+hlrd"; var text = "Ovaj dea+hlrd svima smeta."; var escaped = name.replace(/[^\w\s]/g, "\\$&"); var regexp = new RegExp("\\b(" + escaped + ")\\b", "gi"); console.log(text.replace(regexp, "_$1_")); // → Ova _dea+hlrd_ je sve iznervirala.

metoda pretraživanja

Metoda indexOf ne može se koristiti s regularnim izrazima. Ali postoji metoda pretraživanja koja samo očekuje regularni izraz. Kao i indexOf, vraća indeks prvog pojavljivanja ili -1 ako se ništa ne dogodi.

Console.log(" riječ".pretraži(/\S/)); // → 2 console.log(" ".search(/\S/)); // → -1

Nažalost, ne postoji način da kažete metodi da traži podudaranje počevši od određenog pomaka (kao što možete učiniti s indexOf). To bi bilo od pomoći.

svojstvo lastIndex

Metoda exec također ne pruža prikladan način za početak pretraživanja od zadane pozicije u nizu. Ali daje nezgodan način.

Objekt regularnog izraza ima svojstva. Jedan od njih je izvor, koji sadrži string. Drugi je lastIndex, koji kontrolira, pod nekim uvjetima, gdje će započeti sljedeća potraga za pojavljivanjima.

Ovi uvjeti uključuju da globalna opcija g mora biti prisutna i da se pretraga mora izvršiti koristeći exec metodu. Razumnije rješenje bilo bi jednostavno dopustiti da se dodatni argument proslijedi exec-u, ali razumnost nije temeljna značajka sučelja JavaScript regularnog izraza.

Var pattern = /y/g; pattern.lastIndex = 3; var match = pattern.exec("xyzzy"); console.log(match.index); // → 4 console.log(pattern.lastIndex); // → 5

Ako je pretraživanje bilo uspješno, exec poziv ažurira svojstvo lastIndex da pokazuje na poziciju nakon pronađene pojave. Ako nije bilo uspjeha, lastIndex se postavlja na nulu - baš kao i lastIndex novostvorenog objekta.

Kada koristite globalnu regularnu varijablu i višestruke exec pozive, ova automatska ažuriranja lastIndexa mogu uzrokovati probleme. Vaš uobičajeni poslužitelj može započeti pretraživanje s pozicije lijevo od prethodnog poziva.

Var znamenka = /\d/g; console.log(digit.exec("ovdje je: 1")); // → ["1"] console.log(digit.exec("i sada: 1")); // → nula

Još jedan zanimljiv učinak opcije g je da mijenja način rada metode podudaranja. Kada se pozove s ovom opcijom, umjesto vraćanja niza sličnog rezultatu exec, pronalazi sva pojavljivanja uzorka u nizu i vraća niz pronađenih podnizova.

Console.log("Banana".match(/an/g)); // → ["an", "an"]

Stoga budite oprezni s globalnim regularnim varijablama. Slučajevi u kojima su potrebni - zamjena poziva ili mjesta gdje posebno koristite lastIndex - vjerojatno su svi slučajevi u kojima bi se trebali koristiti.

Ciklusi pojavljivanja

Tipičan zadatak je iteracija kroz sva pojavljivanja uzorka u nizu tako da može pristupiti objektu podudaranja u tijelu petlje koristeći lastIndex i exec.

Var input = "Red s 3 broja u sebi... 42 i 88."; promjenljivi broj = /\b(\d+)\b/g; var utakmica; while (match = number.exec(input)) console.log("Pronađen ", podudaranje, " na ", match.index); // → Pronađeno 3 puta 14 // Pronađeno 42 puta 33 // Pronađeno 88 puta 40

Iskorištava činjenicu da je vrijednost dodjele vrijednost koja se dodjeljuje. Korištenjem match = re.exec(input) kao uvjeta u while petlji, tražimo na početku svake iteracije, pohranjujemo rezultat u varijablu i završavamo petlju kada se pronađu sva podudaranja.

Raščlanjivanje INI datoteka

Za kraj poglavlja, pogledajmo problem koji koristi regularne izraze. Zamislimo da pišemo program koji automatski prikuplja informacije o našim neprijateljima putem interneta. (Nećemo napisati cijeli program, samo dio koji čita datoteku postavki. Oprostite.) Datoteka izgleda ovako:

Searchengine=http://www.google.com/search?q=$1 spitefulness=9.7 ; ispred komentara se stavlja točka-zarez; svaki odjeljak se odnosi na različitog neprijatelja fullname=Larry Doe type=kindergarten bull website=http://www.geocities.com/CapeCanaveral/11451 fullname=Gargamel type=evil wizard outputdir=/home/marijn/enemies/gargamel

Točan format datoteke (koji se prilično široko koristi i obično se naziva INI) je sljedeći:

Prazni redovi i redovi koji počinju točkom i zarezom se zanemaruju
- linije u uglatim zagradama započinju novi odjeljak
- retke koji sadrže alfanumerički identifikator iza kojeg slijedi = dodajte postavku u ovaj odjeljak

Sve ostalo su netočni podaci.

Naš zadatak je pretvoriti takav niz u niz objekata, od kojih svaki ima svojstvo naziva i niz postavki. Jedan objekt je potreban za svaki odjeljak, a drugi je potreban za globalne postavke na vrhu datoteke.

Budući da datoteku treba raščlaniti redak po redak, dobra je ideja započeti rastavljanjem datoteke u retke. Da bismo to učinili, koristili smo string.split("\n") u 6. poglavlju. Neki operativni sustavi ne koriste jedan \n znak za prijelom retka, već dva - \r\n. Budući da metoda split uzima regularne izraze kao argument, možemo podijeliti retke pomoću izraza /\r?\n/, dopuštajući i pojedinačne \n i \r\n između redaka.

Funkcija parseINI(string) ( // Počnimo s objektom koji sadrži postavke najviše razine var currentSection = (name: null, fields: ); var category = ; string.split(/\r?\n/).forEach(function (linija ) ( var match; if (/^\s*(;.*)?$/.test(line)) ( return; ) else if (match = line.match(/^\[(.*)\ ]$ /)) ( currentSection = (name: match, fields: ); category.push(currentSection); ) else if (match = line.match(/^(\w+)=(.*)$/)) ( currentSection. fields.push((name: match, value: match)); ) else ( throw new Error("Redak "" + line + "" sadrži nevažeće podatke."); ) )); vrati kategorije; )

Kod prolazi kroz sve retke, ažurirajući objekt trenutnog odjeljka "trenutni odjeljak". Prvo provjerava može li se linija zanemariti pomoću regularnog izraza /^\s*(;.*)?$/. Možete li zamisliti kako ovo funkcionira? Dio između zagrada odgovara komentarima, ha? čini tako da će obični znak također odgovarati retcima koji se sastoje samo od razmaka.

Ako redak nije komentar, kod provjerava počinje li novi odjeljak. Ako da, stvara se novi objekt za trenutni odjeljak kojemu se dodaju naknadne postavke.

Posljednja smislena mogućnost je da je niz normalna postavka, u kojem slučaju se dodaje trenutnom objektu.

Ako nijedna od opcija ne radi, funkcija daje pogrešku.

Primijetite kako česta upotreba ^ i $ osigurava da izraz odgovara cijelom nizu, a ne samo njegovom dijelu. Ako ih ne koristite, kôd će uglavnom raditi, ali će ponekad proizvesti čudne rezultate i pogrešku će biti teško pronaći.

Konstrukcija if (match = string.match(...)) slična je triku korištenja dodjele kao uvjeta u while petlji. Često ne znate hoće li poziv podudaranja uspjeti, tako da objektu rezultata možete pristupiti samo unutar if bloka koji ga provjerava. Kako ne bismo prekinuli prekrasan lanac if provjera, dodjeljujemo rezultat pretraživanja varijabli i tu dodjelu odmah koristimo kao provjeru.

Međunarodni simboli

Zbog početne jednostavne implementacije jezika i naknadne fiksacije takve implementacije "u granitu", JavaScript regularni izrazi su glupi sa znakovima koji se ne nalaze u engleskom jeziku. Na primjer, znak "slovo", sa stajališta JavaScript regularnih izraza, može biti jedno od 26 slova engleske abecede, a iz nekog razloga također i podvlaka. Slova poput é ili β, koja su očito slova, ne odgovaraju \w (a odgovarat će \W, što nije slovo).

U čudnom obratu, povijesno \s (razmak) odgovara svim znakovima koji se smatraju razmakom u Unicodeu, uključujući stvari poput neprekinutog razmaka ili mongolskog razdjelnika samoglasnika.

Neke implementacije regularnih izraza u drugim jezicima imaju posebnu sintaksu za traženje posebnih kategorija Unicode znakova, kao što su "sva velika slova", "svi interpunkcijski znakovi" ili "kontrolni znakovi". Postoje planovi za dodavanje takvih kategorija u JavaScript, ali vjerojatno se neće uskoro implementirati.

Poanta

Regulari su objekti koji predstavljaju obrasce pretraživanja u nizovima. Oni koriste vlastitu sintaksu da izraze te obrasce.

/abc/ Slijed znakova
// Bilo koji znak s popisa
/[^abc]/ Bilo koji znak osim znakova s ​​popisa
// Bilo koji znak iz intervala
/x+/ Jedno ili više pojavljivanja uzorka x
/x+?/ Jedno ili više pojavljivanja, nepohlepno
/x*/ Nula ili više pojavljivanja
/x?/ Nula ili jedno pojavljivanje
/x(2,4)/ Od dva do četiri pojavljivanja
/(abc)/ Skupina
/a|b|c/ Bilo koji od nekoliko uzoraka
/\d/ Bilo koji broj
/\w/ Bilo koji alfanumerički znak ("slovo")
/\s/ Bilo koji razmak
/./ Bilo koji znak osim novog reda
/\b/ Granica riječi
/^/ Početak retka
/$/ Kraj retka

Regularni izraz ima test metodu za provjeru postoji li uzorak u nizu. Postoji exec metoda koja vraća niz koji sadrži sve pronađene grupe. Niz ima svojstvo indeksa koje sadrži broj znaka iz kojeg je došlo do podudaranja.

Nizovi imaju metodu podudaranja za podudaranje uzoraka i metodu pretraživanja koja vraća samo početnu poziciju pojavljivanja. Metoda replace može zamijeniti pojavljivanja uzorka drugim nizom. Osim toga, možete proslijediti funkciju za zamjenu koja će izgraditi zamjenski redak na temelju predloška i pronađenih grupa.

Uobičajeni znakovi imaju postavke koje se pišu nakon završne kose crte. Opcija i čini regularni izraz neosjetljivim na velika i mala slova, a opcija g ga čini globalnim, što, između ostalog, uzrokuje da metoda replace zamijeni sve pronađene pojave, a ne samo prvu.

RegExp konstruktor može se koristiti za stvaranje regularnih izraza iz nizova.

Regulatori su oštar instrument s neudobnom ručkom. Oni uvelike pojednostavljuju neke zadatke, a mogu postati neupravljivi pri rješavanju drugih, složenih problema. Dio učenja korištenja regularnih izraza je sposobnost odoljeti iskušenju da ih natrpate zadatkom za koji nisu namijenjeni.

Vježbe

Neizbježno ćete se pri rješavanju problema susresti s nerazumljivim slučajevima, a ponekad možete i očajavati kada vidite nepredvidivo ponašanje nekih regularnih izraza. Ponekad pomaže proučavanje ponašanja običnog motora putem internetske usluge kao što je debuggex.com, gdje možete vidjeti njegovu vizualizaciju i usporediti je sa željenim učinkom.
Obični golf
“Golf” u kodu je igra u kojoj trebate izraziti zadani program u minimalnom broju znakova. Regularni golf praktična je vježba pisanja najmanjih mogućih regularnih igrača kako bi se pronašao zadani obrazac, i samo to.

Za svaki od podredova napišite regularni izraz da biste provjerili njihovu lokaciju u retku. Uobičajeni motor trebao bi pronaći samo ove navedene podnizove. Ne brinite o granicama riječi osim ako nije izričito navedeno. Kada imate pravilan uzorak, pokušajte ga smanjiti.

Auto i mačka
- pop i podupirač
- tvor, trajekt i ferari
- Bilo koja riječ koja završava na ious
- Razmak nakon kojeg slijedi točka, zarez, dvotočka ili točka-zarez.
- Riječ duža od šest slova
- Riječ bez slova e

// Unesite svoje regularne izraze verify(/.../, ["my car", "bad cats"], ["camper", "high art"]); provjeri(/.../, ["pop kultura", "mad props"], ["plop"]); provjeri(/.../, ["ferret", "trajekt", "ferrari"], ["ferrum", "transfer A"]); verify(/.../, ["kako ukusno", "prostrana soba"], ["ruševno", "svijest"]); verify(/.../, ["loša interpunkcija ."], ["izbjeći točku"]); potvrdi(/.../, ["hottenottententen"], ["ne", "hotten totten tenten"]); verify(/.../, ["crveni kljunar", "lelujavo gnijezdo"], ["zemljani krevet", "majmun koji uči"]); funkcija verify(regexp, yes, no) ( // Ignoriraj nedovršene vježbe if (regexp.source == "...") return; yes.forEach(function(s) ( if (!regexp.test(s)) console .log("Nije pronađeno "" + s + """); )); no.forEach(function(s) ( if (regexp.test(s)) console.log("Neočekivana pojava "" + s + ""); )); )

Citati u tekstu
Recimo da ste napisali priču i koristili jednostruke navodnike kako biste naznačili dijalog. Sada želite zamijeniti navodnike dijaloga dvostrukim navodnicima, a jednostruke navodnike ostaviti u kraticama za riječi kao što su ne.

Smislite obrazac koji razlikuje ove dvije upotrebe navodnika i napišite poziv zamjenu metode koja vrši zamjenu.

Opet brojevi
Nizovi brojeva mogu se pronaći jednostavnim regularnim izrazom /\d+/.

Napišite izraz koji pronalazi samo brojeve napisane JavaScript stilom. Mora podržavati mogući minus ili plus ispred broja, decimalnu točku i znanstveni zapis 5e-3 ili 1E10 - opet s mogućim plusom ili minusom. Također imajte na umu da ne mora nužno biti brojeva prije ili iza točke, ali se broj ne može sastojati od jedne točke. To jest, .5 ili 5. su valjani brojevi, ali jedna točka sama po sebi nije.

// Ovdje unesite pravilan niz. promjenljivi broj = /^...$/; // Testovi: ["1", "-1", "+15", "1.55", ".5", "5.", "1.3e2", "1E-4", "1e+12"] .forEach(function(s) ( if (!number.test(s)) console.log("Nisam pronašao "" + s + """); )); ["1a", "+-1", "1.2.3", "1+1", "1e4.5", ".5.", "1f5", "."].zaSvaku(funkciju(e) ( if (number.test(s)) console.log("Neispravno prihvaćeno "" + s + """); ));

Ovaj članak pokriva osnove korištenja regularnog izraza u Javascriptu.

Uvod

Što je regularni izraz?

JS regularni izraz je niz znakova koji tvori pravilo pretraživanja. Ovo se pravilo zatim može koristiti za pretraživanje teksta, kao i za njegovu zamjenu. U praksi se regularni izraz može čak sastojati od jednog znaka, ali složeniji uzorci pretraživanja su češći.

U Javascriptu, regularni izrazi također su objekti. To su obrasci koji se koriste za podudaranje nizova znakova u nizovima. Koriste se u metodama exec() i test() objekta RegExp, te u metodama match(), replace(), search i split() objekta String.

Primjer

var pattern = /example/i

/example/i je regularni izraz. primjer je predložak ( koji će se koristiti u pretrazi). i je modifikator koji pokazuje osjetljivost na velika i mala slova.

Priprema regularnog izraza

JS regularni izrazi sastoje se od uzorka i modifikatora. Sintaksa će biti otprilike ovakva:

/uzorak/modifikatori;

Predložak navodi pravilo pretraživanja. Sastoji se od jednostavnih znakova poput /abc/ ili kombinacije jednostavnih i posebnih znakova: /abc/ ili /Chapter (d+).d/ .

Tablica predloška

Modifikatori vam omogućuju da upiti budu osjetljivi na velika i mala slova, globalni i tako dalje. Koriste se za provođenje pretraživanja osjetljivih na velika i mala slova, kao i za globalna pretraživanja.

Tablica modifikatora

Sada smo spremni primijeniti JS regularne izraze. Postoje dva glavna načina za to: korištenje regularnog izraza objekta ili regularnog izraza na nizu.

Korištenje objekta regularnog izraza

Stvorite objekt regularnog izraza

Ovaj objekt opisuje uzorak znakova. Koristi se za usklađivanje uzoraka. Postoje dva načina za konstruiranje objekta regularnog izraza.

Metoda 1: Upotreba literala regularnog izraza koji se sastoji od uzorka omeđenog kosim crtama, na primjer:

var reg = /ab+c/;

Literali regularnog izraza pokreću predkompilaciju regularnog izraza kada se skripta analizira. Ako je regularni izraz konstantan, upotrijebite ga za poboljšanje izvedbe.

Metoda 2: Pozivanje funkcije konstruktora objekta RegExp, na primjer:

var reg = new RegExp("ab+c");

Korištenje konstruktora omogućuje kompajliranje regularnog izraza JS dok se skripta izvodi. Koristite ovu metodu ako će se regularni izraz promijeniti ili ako ne znate uzorak unaprijed. Na primjer, ako primite informacije od korisnika koji unese upit za pretraživanje.

Objektne metode regularnog izraza

Pogledajmo nekoliko uobičajenih metoda objekta regularnih izraza:

  • sastaviti() ( zastarjelo u verziji 1.5) – kompilira regularni izraz;
  • exec() - Izvodi podudaranje niza. Vraća prvu utakmicu;
  • test() - izvodi podudaranje niza. Vraća true ili false;
  • toString() – vraća vrijednost niza regularnog izraza.

Primjeri

Korištenje test()

Metoda test() regularni je izraz RegExp objekta. Traži uzorak niza i vraća true ili false ovisno o rezultatu. Sljedeći primjer JS regularnog izraza pokazuje kako se niz traži za znak " e”:

var patt = /e/; patt.test("Najbolje stvari na svijetu su besplatne!");

Budući da ovdje u retku postoji " e“, rezultat ovog koda bit će istinit.

Regularni izrazi ne moraju biti smješteni u varijablu. Isti upit može se napraviti u jednom redu:

/e/.test("Najbolje stvari na svijetu su besplatne!");

Korištenje exec()

Pretražuje niz koristeći zadano pravilo pretraživanja i vraća pronađeni tekst. Ako nisu pronađeni rezultati, rezultat će biti nula.

Pogledajmo metodu na djelu, koristeći primjer istog simbola “ e”:

/e/.exec("Najbolje stvari na svijetu su besplatne!");

Budući da linija sadrži " e”, rezultat ovog koda će biti .e .

Primjena regularnog izraza na string

U Javascriptu se ovi izrazi također mogu koristiti s dvije metode objekta String: search() i replace(). Oni su potrebni za traženje i zamjenu u tekstu.

  • metoda search() - koristi izraz za traženje podudaranja i vraća informacije o lokaciji podudaranja;
  • Metoda replace() vraća modificirani niz sa zamijenjenim uzorkom.

Primjeri

Korištenje JS regularnog izraza za izvođenje pretraživanja osjetljivog na velika i mala slova za izraz " w3skole" u redu:

var str = "Posjetite W3Schools"; var n = str.search(/w3schools/i);

Rezultat u n će biti 6.

Metoda pretraživanja također uzima niz kao argument. Argument niza bit će pretvoren u regularni izraz:

Korištenje niza za traženje izraza " W3schools" u redu.

Regularni izrazi omogućuju vam fleksibilno pretraživanje riječi i izraza u tekstovima kako biste ih izbrisali, izdvojili ili zamijenili.

Sintaksa:

//Prva opcija za stvaranje regularnog izraza var regexp=new RegExp( uzorak,modifikatori); //Druga opcija za stvaranje regularnog izraza var regexp=/ uzorak/modifikatori;

uzorak omogućuje vam da odredite uzorak znakova za pretraživanje.

modifikatori omogućuju vam da prilagodite ponašanje pretraživanja:

  • ja- pretraživanje bez uzimanja u obzir veličine slova;
  • g- globalno pretraživanje (pronaći će se sva podudaranja u dokumentu, ne samo prva);
  • m- pretraživanje u više redaka.

Tražite riječi i izraze

Najjednostavnija upotreba regularnih izraza je traženje riječi i izraza u različitim tekstovima.

Evo primjera korištenja pretraživanja pomoću modifikatora:

//Postavi regularni izraz rv1 rv1=/Rusija/; //Navedite regularni izraz rv2 rv2=/Rusija/g; //Navedite regularni izraz rv3 rv3=/Rusija/ig; //Podebljano označava gdje će se naći podudaranja u tekstu kada se koristi //izraz rv1: Rusija je najveća država na svijetu. Rusija graniči sa 18 zemalja. RUSIJA je država nasljednica SSSR-a. //Podebljano označava gdje će se naći podudaranja u tekstu kada se koristi //izraz rv2: Rusija je najveća država na svijetu. Rusija graniči sa 18 zemalja. RUSIJA je država nasljednica SSSR-a."; //Podebljani font označava gdje će se naći podudaranja u tekstu kada se koristi //izraz rv3: Rusija je najveća država na svijetu. Rusija graniči s 18 zemalja. RUSIJA je država nasljednica SSSR-a.";

Posebni simboli

Uz regularne znakove, mogu se koristiti i obrasci regularnih izraza Posebni simboli(metaznakovi). Posebni znakovi s opisima prikazani su u donjoj tablici:

Poseban karakter Opis
. Odgovara bilo kojem znaku osim znaku za kraj retka.
\w Odgovara bilo kojem abecednom znaku.
\W Odgovara bilo kojem neabecednom znaku.
\d Odgovara znakovima koji su brojevi.
\D Odgovara znakovima koji nisu brojevi.
\s Odgovara razmacima.
\S Odgovara znakovima koji nisu razmaci.
\b Podudaranja će se pronaći samo na granicama riječi (na početku ili na kraju).
\B Podudaranja će se tražiti samo na granicama koje nisu riječi.
\n Odgovara znaku novog retka.

/* Izraz reg1 će pronaći sve riječi koje počinju s dva proizvoljna slova i završavaju s "vet". Budući da su riječi u rečenici odvojene razmakom, dodat ćemo poseban znak \s na početku i na kraju */ reg1=/\s..vet\s/g; txt="zdravo covenant samt ormar"; document.write(txt.match(reg1) + "
"); /* Izraz reg2 će pronaći sve riječi koje počinju s tri proizvoljna slova i završavaju s "vet" */ reg2=/\s...vet\s/g; document.write(txt.match(reg2) + "
"); txt1=" hi2hello hi 1hello "; /* Izraz reg3 će pronaći sve riječi koje počinju s "at" nakon čega slijedi 1 znamenka i završavaju s "vet" */ var reg3=/at\dvet/g; document . napiši(txt1.match(reg3) + "
"); // Izraz reg4 će pronaći sve brojeve u tekstu var reg4=/\d/g; txt2="5 godina učenja, 3 godine jedrenja, 9 godina snimanja." document.write(txt2. match(reg4) + "
");

Brzi pogled

Simboli u uglatim zagradama

Korištenje uglatih zagrada [ključ] Možete odrediti grupu znakova za pretraživanje.

Znak ^ ispred grupe znakova u uglatim zagradama [^kwg] označava da morate tražiti sve znakove abecede osim navedenih.

Korištenje crtice (-) između znakova u uglatim zagradama [a-z] Možete odrediti raspon znakova za pretraživanje.

Također možete tražiti brojeve pomoću uglatih zagrada.

//Postavi regularni izraz reg1 reg1=/\sko[tdm]\s/g; //Postavi tekstualni niz txt1 txt1=" cat braid code komoda com tepih "; //Koristeći regularni izraz reg1, potražite niz txt1 document.write(txt1.match(reg1) + "
"); reg2=/\sslo[^tg]/g; txt2=" slot slot slog "; document.write(txt2.match(reg2) + "
"); reg3=//g; txt3="5 godina učenja, 3 godine plivanja, 9 godina gađanja"; document.write(txt3.match(reg3));

Brzi pogled

Kvantifikatori

Kvantifikator- ovo je konstrukcija koja vam omogućuje da odredite koliko puta se prethodni znak ili grupa znakova trebaju pojaviti u podudaranju.

Sintaksa:

//Prethodni znak mora se pojaviti x - puta (x)//Prethodni znak mora se pojaviti od x do y uključivo puta (x,y)//Prethodni znak mora se pojaviti najmanje x puta (x,)//Određuje da se prethodni znak mora pojaviti 0 ili više puta * //Određuje da se prethodni znak mora pojaviti 1 ili više puta + //Određuje da se prethodni znak mora pojaviti 0 ili 1 put ?


//Navedite regularni izraz rv1 rv1=/ko(5)shka/g //Navedite regularni izraz rv2 rv2=/ko(3,)shka/g //Navedite regularni izraz rv3 rv3=/ko+shka/g //Navedite regularni izraz rv4 rv4=/ko?shka/g //Postavite regularni izraz rv5 rv5=/ko*shka/g //Podebljani font pokazuje gdje će se u tekstu pronaći podudaranja kada se koristi //izraz rv1: kshka cat kooshka koooshka kooooshka kooooshka kooooooshka kooooooshka //Podebljano označava gdje će se u tekstu pronaći podudaranja kada se koristi //rv2 izraz: kshka cat kooshka kooooška kooooška kooooooška kooooooška kooooooška//Podebljano označava gdje će se u tekstu pronaći podudaranja kada se koristi //izraz rv3: kshka mačka kooška kooooška kooooška kooooška kooooooška kooooooška//Podebljano označava gdje će se u tekstu naći podudaranja kada se koristi //rv4 izraz: kshka cat kooshka koooshka kooooshka koooooshka koooooshka kooooooshka //Podebljano označava gdje će se u tekstu pronaći podudaranja kada se koristi //rv5 izraz: kshka cat kooshka kooooshka kooooshka kooooshka kooooooshka kooooooshka

Bilješka: ako želite koristiti bilo koji poseban znak (kao što je . * + ? ili ()) kao uobičajeni znak, morate staviti \ ispred njega.

Korištenje zagrada

Stavljanjem dijela uzorka regularnog izraza u zagrade, govorite izrazu da zapamti podudaranje koje je pronašao taj dio uzorka. Spremljeno podudaranje možete koristiti kasnije u svom kodu.

Na primjer, regularni izraz /(Dmitry)\sVasiliev/ će pronaći niz "Dmitry Vasiliev" i zapamtiti podniz "Dmitry".

U donjem primjeru koristimo metodu replace() za promjenu redoslijeda riječi u tekstu. Koristimo $1 i $2 za pristup pohranjenim podudaranjima.

Var regexp = /(Dmitry)\s(Vasiliev)/; var text = "Dmitrij Vasiljev"; var newtext = text.replace(regexp, "$2 $1"); document.write(novitekst);

Brzi pogled

Zagrade se mogu koristiti za grupiranje znakova prije kvantifikatora.



 


Čitati:



Brisanje objekata u 1s 8

Brisanje objekata u 1s 8

Kada počinju raditi u programima tvrtke 1C, mnogi ljudi imaju pitanje: kako izbrisati nepotrebne dokumente ili elemente imenika? Kada pritisnete tipku...

1s zup 3.0 mjenjačko računovodstvo. Postavljanje rasporeda razmjene podataka

1s zup 3.0 mjenjačko računovodstvo.  Postavljanje rasporeda razmjene podataka

Reći ćemo vam kako postaviti sinkronizaciju podataka u osnovnim verzijama programa 1C:ZUP 3.0 s osnovnim verzijama 1C:BP 3.0, budući da se ovo pitanje često...

1s 83 crtični kod za primjer fakture

1s 83 crtični kod za primjer fakture

Crtični kod je niz bijelih i crnih traka koje prikazuju određene informacije. Ovo je jedan od naj...

Kako doći do podataka iz tabelarnog dijela dokumenata?

Kako doći do podataka iz tabelarnog dijela dokumenata?

Tablični dijelovi postoje za mnoge objekte u 1C: Imenici Dokumenti Izvješća i obrada Kontni planovi Grafikoni tipova karakteristika Grafikoni tipova...

feed-image RSS