| prethodna sadržaj slijedeća |
| Vodič za core JavaScript 1.5 |
Poglavlje 4 Regularni izrazi
Regularni izrazi su uzorci koji se koriste pri pretraživanju u kombinaciji stringova. U JavaScriptu, regularni izrazi su također objekti. Ovi uzorci koriste se sa exec i test metodama u RegExp i sa match, replace , search i split metodama String objekta. Ovo poglavlje objašnjava regularne izraze.
JavaScript 1.1 i ranije. Regularni izrazi nisu definirani u JavaScript 1.1 i ranije.
Kreiranje regularnih izraza
Kreiranje regularnih izraza
Konstrukcija regularnih izraza može se izvesti na dva načina:
Upotrebom podatka regularnog izraza, kao npr. :
- Podatak regularnog izraza omogućava kompajliranje regularnog izraza pri izvršavanju skripte. Ako će regularni izraz ostati konstantan, koristite ovaj način radi boljeg izvršavanja.
Pozivanjem konstruktor funkcije RegExp objekta, kao npr. :
Upotrebom konstruktor funkcije osigurava se runtime kompilacija regularnog izraza. Upotrijebite konstruktor funkciju kada znate da će se uzorak regularnog izraza mijenjati ili ne znate uzorak te ga dobivate iz nekog drugog izvora kao npr korisnički unos nekog podatka.
Pisanje uzorka regularnog izraza
Uzorak regularnog izraza sastoji se od jednostavnih znakova, kao npr. /abc/, ili kombinacije jednotavnih i specijalnih znakova, kao npr. /ab*c/ ili
/Chapter (\d+)\.\d*/ . Posljednji primjer sadrže zagrade koje služe za memoriranje. Podudarnost napravljena s ovim dijelom uzorka se pamti za kasniju upotrebu, opisano u Uporaba zagrada u substring podudaranju.
Uporaba jednostavnih uzoraka
Jednostavni uzorci sadrže znakove za koje želite pronaći direktnu podudarnost. Npr., uzorak /abc/ podudara se sa kombinacijom znakova u stringovima samo u slučaju da su znakovi 'abc' zajedno i u tom poretku. Takvu podudarnost ćete naći u stringu "Hi, do you know your abc's?" i u "The latest airplane designs evolved from slabcraft." U oba slučaja podudarnost je u 'abc'. Podudarnost ne postoji u stringu "Grab crab" jer ne sadrži podstring 'abc'.
Uporaba speijalnih znakova
Kad pretraživanje podudarnosti zahtijeva nešto više od direktne podudarnosti, kao npr. traženje jednog ili više b-ova, ili pretraživanje praznih mjesta, uzorak mora sadržavati specijalne znakove. Npr., uzorak /ab*c/ podaudara se sa bilo kakvom kombinacijom znakova u kojoj je jedno 'a' ispred nijednog ili više 'b'-ova ( * znači 0 ili više slučajeva znaka ispred) ,a odmah nakon toga mora biti znak 'c'. U stringu "cbbabbbbcdebc," uzorak se podudara sa substringom 'abbbbc'.
U narednoj tablici naći ćete potpuni popis i opis specijalnih znakova koji se mogu koristiti u regularnim izrazima.
4.1 Specijalni znakovi u regularnim izrazima. Tablica
Upotreba zagrada
Zagrade oko bilo kojeg dijela uzorka regularnog izraza izaziva pamćenje pri nalazu podudarnosti. Jednom zapamćen, substring se može opozvati za daljnju upotrebu, kao što je opisano u Upotreba zagrada u substring podudaranju.
Npr., uzorak /Chapter (\d+)\.\d*/ predstavlja dodatne escaped i specijalne znakove i omogućava da dio uzorka bude zapamćen. Točnije, nalazi podudarnost znakova 'Chapter ' iza kojeg slijedi jedan ili više znakova ( \d označava bilo koji broj,a + znači 1 ili više puta), iza toga nalazi se decimana točka (koja je po sebi specijalni znak; stavljajući ispred dec. točke \ znači da uzorak sadrži znak '.'), a iza svega je opet neki broj 0 ili više puta ( \d označava broj, * znači 0 ili više puta). Nadalje, zagrade se koriste da zapamte prvi broj koji se podudara.
Ovaj uzorak je nađen u "Open Chapter 4.3, paragraph 6" te je '4' zapamćen. Uzorak nije nađen u "Chapter 3 and 4", jer string nema točku nakon '3'.
Da bi se našla podudarnost substringa bez zapamćivanja, unutar zagrada ispred uzorka stavite ?: . Npr., (?:\d+) nalazi podudarnost sa jednim ili više brojeva, ali to neće zapamtiti.
Rad sa regularnim izrazima
Regularni izrazi se koriste sa RegExp metodama test i exec i sa String metodama match , replace , search i split. Ove metode su detaljno objašnjene u Core JavaScript Reference.
Tablica 4.2 metode koje koriste regaularne izraze
Kada želite znati da li je pronađen uzorak u stringu upotrijebite test ili search metodu. Za detaljniju informaciju (ali sporije izvršavanje) upotrijebite exec ili match metode. Ako upotrijebite exec ili match i ako je podudaranje uzastopno, ove metode daju niz i osvježavaju svojstva pridružena objektima reg. izraza, a također i predifiniranih objakata regularnih izraza, RegExp. Ako podudarnost ne postoji, exec metoda daje null (koje se pretvara u false). U narednom primjeru, skripta koristi exec metodu da bi pronašla podudarnost u stringu.
<SCRIPT LANGUAGE="JavaScript1.2">
myRe=/d(b+)d/g;
myArray = myRe.exec("cdbbdbsbz");
</SCRIPT>Ako ne trebate pristupiti osobinama regularnog izraza, alternativni način krairanja myArray je pomoću skripte:
<SCRIPT LANGUAGE="JavaScript1.2">
myArray = /d(b+)d/g.exec("cdbbdbsbz");
</SCRIPT>
Ako želite kreirati regularni izraz iz stringa, još jedna alternativa je skripta:
<SCRIPT LANGUAGE="JavaScript1.2">
myRe= new RegExp ("d(b+)d", "g");
myArray = myRe.exec("cdbbdbsbz");
</SCRIPT>
Pomoću ovih skritpti, traženje podudarnosti je uzastopno,za rezultat daje niz, te osvježava svojstva prikazana u tablici.
Tablica 4.3 Resultati izvršavanja regularnih izraza.
objekt
osobina ili index
opis
u ovom primjeru myArray
index
input
[0]
myRe lastIndex
Index od kojeg treba početi tražiti narednu podudarnost. (Ovo svojstvo se postavlja samo ako reg. izraz koristi g opciju, opisano u Izvršavanje globalnog pretraživanja, slučaj ignoriranja i uzimanje u obzir višelinijskog inputa.) source
Text uzorka.Osvježen za vrijeme kreiranja, a ne izvršavanja.
Prema onom što je prikazano u drugačijem obliku ovog primjera, možete upotrijebiti regularni izraz napravljenog pomoću objekt inicijalizatora bez pridruživanja varijabli. Ukoliko to učinite onda je svaki događaj novi regularni izraz. Zato, ako koristite ovaj oblik bez pridruživanja varijabli, ne možete naknadno pristupiti svojstvima tog regularnog izraza. Npr., pretpostavimo da imate slijedeću skriptu:
<SCRIPT LANGUAGE="JavaScript1.2">
myRe=/d(b+)d/g;
myArray = myRe.exec("cdbbdbsbz");
document.writeln("The value of lastIndex is " + myRe.lastIndex);
</SCRIPT>
Vrijednost od lastIndex je 5
No ako imate ovu skriptu:
<SCRIPT LANGUAGE="JavaScript1.2">
myArray = /d(b+)d/g.exec("cdbbdbsbz");
document.writeln("The value of lastIndex is " + /d(b+)d/g.lastIndex);
</SCRIPT>
Događaji od /d(b+)d/g u dvjema naredbama su različiti objekti regularnih izraza i zato imaju različite vrijednosti njihovih lastIndex svojstava. Ako trebate pristupiti svojstvima regularnih izraza kreiranih pomoću objekt inicijalizatora, morate ih prvo pridružiti varijabli.
Vrijednost od lastIndex je 0
Upotreba substringa u zagradi
Upotrebivši zagradu u uzorku reg. izraza omogućuje se da podudarnost bude zapamćena. Npr., /a(b)c/ Nalazi podudarnost sa 'abc' i pamti 'b'. Za opozivanje dobivenog rezultata, koristiti Array elemente [1], ..., [n] .
Broj mogućih substringova u zagradi je neograničen. Rezultantni niz zadrži sve podudarnosti. Pogledajte naredni primjer.
Primjer 1. Naredna skripta koristi replace (zamjeni) metodu za prebacivanje riječi u stringu. Za zamjenski text, skripta koristi $1 i $2 pri zamjeni da označi prvi string i drugi substring u zagradi koji se podudara.
<SCRIPT LANGUAGE="JavaScript1.2">
re = /(\w+)\s(\w+)/;
str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
</SCRIPT>
Primjer 2. U narednom primjeru, RegExp.input se postavlja pomću Change događaja. U getInfo funkciji, exec metoda, pozvana koristeći () shortcut notaciju, koristi vrijednoti od RegExp.input kao svoj argument.
<SCRIPT LANGUAGE="JavaScript1.2">
function getInfo(){
a = /(\w+)\s(\d+)/();
window.alert(a[1] + ", your age is " + a[2]);
}
</SCRIPT>
Unesite vaše ime i godine i pritismite Enter.
<FORM>
<INPUT TYPE="text" NAME="NameAge" onChange="getInfo(this);">
</FORM>
Izvršavanje global search-a, ignoring case-a i uzimanje u obzir multiline input-a
Regularni izrazi imaju tri opcionalna flaga (indikatora stanja) koji dozvoljavaju global i case insensitive searching (globalno pretraživanje i pretraživanje bez osjetljivosti na mala i velika slova). Da naznačiteglobal search upotrijebite g flag. Da naznačite case-insensitive search upotrijebite i flag. Da naznačite multi-line search upotrijebite m flag. Ovi flagovi mogu stajati sami ili zajedno u bilo kojem poretku te se smatraju dijelom regularnog izraza.
Pri unosu flaga u reg. izraz koristite sintaksu:
re = /pattern/flags
re = new RegExp("pattern", ["flags"])
Uočite da su flagovi integralni dijelovi reg. izraza te kasnije ne mogu biti dodani niti maknuti.
Npr., re = /\w+\s/g stvara regularni izraz koji traži jedan ili više znakova iza kojih je space (razmaknica) i pretražuje takvu kombinaciju kroz cijeli string.
<SCRIPT LANGUAGE="JavaScript1.2">
re = /\w+\s/g;
str = "fee fi fo fum";
myArray = str.match(re);
document.write(myArray);
</SCRIPT>
Ovo prikazuje ["fee ", "fi ", "fo "]. U ovom primjeru možete zamjeniti liniju:
re = new RegExp("\\w+\\s", "g"); Flag m je upotrijebljen da omogući da višelinijski input string bude tretiran kao više linija. Ako se m flag koristi, ^ i $ nalazi podudarnost na početku ili kraju bilo koje linije unutar input stringa umjesto početka ili kraja čitavog stringa.
Primjeri
Naredni primjeri pokazuju neke upotrebe regularnih izraza.
Promjena poretka u input string u
Naredni primjer ilustrira oblikovanje regularnog izraz te upotrebu string.split() i string.replace(). On čisti grubo formatirani input string koji sadrži imena (prvo ime prvo) odvojeno sa blanks, tabs i točno jednim semicolon (točka-zarez). Naposlijetku, onokreće poredk imena (zadnje ime prvo) te sortira popis.
<SCRIPT LANGUAGE="JavaScript1.2">
// The name string contains multiple spaces and tabs,
// and may have multiple spaces between first and last names.
names = new String ( "Harry Trump ;Fred Barney; Helen Rigby ;\
Bill Abel ;Chris Hand ")
document.write ("---------- Original String" + "<BR>" + "<BR>");
document.write (names + "<BR>" + "<BR>");
// Prepare two regular expression patterns and array storage.
// Split the string into array elements.
// pattern: possible white space then semicolon then possible white space
pattern = /\s*;\s*/;
// Break the string into pieces separated by the pattern above and
// and store the pieces in an array called nameList
nameList = names.split (pattern);
// new pattern: one or more characters then spaces then characters.
// Use parentheses to "memorize" portions of the pattern.
// The memorized portions are referred to later.
pattern = /(\w+)\s+(\w+)/;
// New array for holding names being processed.
bySurnameList = new Array;
// Display the name array and populate the new array
// with comma-separated names, last first.
//
// The replace method removes anything matching the pattern
// and replaces it with the memorized string—second memorized portion
// followed by comma space followed by first memorized portion.
//
// The variables $1 and $2 refer to the portions
// memorized while matching the pattern.
document.write ("---------- After Split by Regular Expression" + "<BR>");
for ( i = 0; i < nameList.length; i++) {
document.write (nameList[i] + "<BR>");
bySurnameList[i] = nameList[i].replace (pattern, "$2, $1")
}
// Display the new array.
document.write ("---------- Names Reversed" + "<BR>");
for ( i = 0; i < bySurnameList.length; i++) {
document.write (bySurnameList[i] + "<BR>")
}
// Sort by last name, then display the sorted array.
bySurnameList.sort();
document.write ("---------- Sorted" + "<BR>");
for ( i = 0; i < bySurnameList.length; i++) {
document.write (bySurnameList[i] + "<BR>")
}
document.write ("---------- End" + "<BR>")
Upotreba specijalnih znakova za provjeru inputa
U narednom primjeru, korisnik unosi telefonski broj. Kada korisnik pritisne Enter, skripta provjerava ispravnost broja. Ukoliko je broj dobar (podudara se s nizom znakova određenih reg. izrazom),skripta iznosi window zahvale i potvrđuje taj broj. Ako broj nije valjan, skripta iznosi window koji obavještava korisnika da broj ne valja.
Regularni pretražuje nijednu ili jednu otvorenu zagradu \(?, nakon čega se nalaze 3 znamenke \d{3}, nakon čega slijedi nijedna ili jedna zatvorena zagrada \)?, nakon čega slijedi jedan dash, forward slash, ili decimal point te kada pronađe pamti znak ([-\/\.]), iza čega su tri znamenke \d{3},a nakon toga zapamćeni dash, forward slash ili decimal point \1 , iza čega su 4 znamenke \d{4}. Uf uf uf i samo uuuuf :-)) .
Change koji se aktivira kad korisnk pritisne Enter postavi vrijednost od RegExp.input .
<HTML>
<SCRIPT LANGUAGE = "JavaScript1.2">
re = /\(?\d{3}\)?([-\/\.])\d{3}\1\d{4}/;
function testInfo() {
OK = re.exec();
if (!OK)
window.alert (RegExp.input +
" isn't a phone number with area code!")
else
window.alert ("Thanks, your phone number is " + OK[0])
}
Enter your phone number (with area code) and then press Enter.
<FORM>
<INPUT TYPE="text" NAME="Phone" onChange="testInfo(this);">
</FORM>
prethodna sadržaj slijedeća
Copyright © 2000 Netscape Communications Corp. All rights reserved.
Posljednje izmjene Rujan 28, 2000