Využití regulárních výrazů v JavaScriptu
03. 02. 2010 | Pavel Salvet | JavaScript a Ajax | Komentáře: 9
Bez regulárních výrazů se dnes programátoři neobejdou a je dobré seznámit se s jejich možnostmi i v JavaScriptu. Článek obsahuje test vašich znalostí.
Testování výskytu
Ke zjištění, zda se v určitém řetězci nachází podřetězec odpovídající danému RE, ideálně poslouží metoda test() objektu RegExp. Jejím argumentem je testovaný řetězec. Vrací hodnotu typu boolean. Následující příklad analyzuje akademický titul.
var titul = window.prompt("Napište své jméno (i s případným titulem).");
var diak = "áäčďéěíĺľňóôőöŕšťúůűüýřž";
var vzor = new RegExp("Dr[^a-z" + diak + "]");
var isDoctor = vzor.test(titul);
if (isDoctor) window.alert("Óóó, Vy jste doktor.");
Hledání pozice výskytu
Metoda search() objektu String zjišťuje, kde v řetězci se nalézá podřetězec odpovídající danému RE, kterýžto má za argument. Vrací index pozice prvního výskytu hledaného podřetězce. Jestliže ten nalezen není, vrací -1. Jedná se tedy o obdobu metody indexOf(). V následujícím příkladu je použita pro bližší určení místa pravopisné chyby.
var veta = "Zlodějky b_l_ chyceny, když kradl_ obraz_.";
var znamka = null;
var pozice_chyby, hlaska;
do {
veta = window.prompt("Doplňte: ", veta);
if (veta == "Zlodějky byly chyceny, když kradly obrazy.") {
znamka = 1;
hlaska = "Výborně";
}
else {
pozice_chyby = veta.search(/[i_]/); //<b>!!!</b>
hlaska = (pozice_chyby > -1)? "Chyba u " + ++pozice_chyby + ". znaku" : "Špatně";
}
window.alert(hlaska);
}
while (!znamka);
Náhrady
Pro nahrazení části nebo částí řeťězce se využívá metoda replace() objektu String, které se předávají dva argumenty - tím prvním je RE, tím druhým náhradní podřetězec. Vrací změněný řetězec.
var pohadka = "O zlé, moc zlé čarodějnici"; var nahradni_slovo = "vlezlé"; pohadka = pohadka.replace(/zlé/g, nahradni_slovo);
V tomto příkladu byl proměnné pohadka nejprve přiřazen řetězec ve znění „O zlé, moc zlé čarodějnici“, posléze bylo v onom řetězci slovo „zlé“ nahrazeno slovem „vlezlé“ a takto pozměněný řetězec byl opětně přiřazen proměnné pohadka. Je důležité si povšimnout, že RE byl použit s volbou g, což způsobilo, že byl nahrazen každý výskyt slova „zlé“ a nikoliv jen první, jak by se stalo bez této volby. Rázem je tu tedy pohádka „o vlezlé, moc vlezlé čarodějnici“. Někdy si ji možná budeme vyprávět. Nyní však dále.
Získání podřetězce
Jak získat z řetězce určitou jeho část odpovídajícího tvaru? Pomůže metoda exec() objektu RegExp nebo metoda match() objektu String. Vracejí buď podřetězec tvaru vyhovujícímu RE, jenž je metodě match() předáván jako argument, nebo null, pokud kýžený podřetězec není nalezen.
V následujícím příkladě se za přispění metody match() kontroluje, jestli se v přijímaném údaji nevyskytují dvě, či více za sebou jdoucích velkých písmen (velkými písmeny se obvykle píší zkratky).
var otazka, stat, hlaska;
do {
otazka = window.prompt("Ze kterého státu pocházíte?");
stat = otazka.match(/[A-ZŽŠČŘĎŤŇ]{2,}/);
hlaska = "Nepoužívejte zkratku! Kdo má hádat, co znamená " + stat +"?";
if (stat) window.alert(hlaska);
}
while (stat)
Rozdělení řetězce
Metoda split() objektu String vytvoří pole řetězců z řetězce, který rozdělí. Jako oddělovač slouží RE, předaný metodě formou argumentu. Oddělovače nejsou do prvků pole zahrnuty, slouží jenom pro rozpoznání konce a začátku jednotlivých položek. Opět jeden malý příklad:
var vyzva = window.prompt("Uveď své oblíbené sporty");
var sporty = (vyzva)? vyzva.split(/,\s?/) : "";
var pocet = sporty.length;
while (pocet) {
navrh = window.confirm("Zahraješ si se mnou "+sporty[pocet-1]+"?");
if (navrh) break;
pocet--;
}
Test na regulární výrazy
Programátorům webových aplikací jsou regulární výrazy užitečné zejména při validaci (ověřování formální správnosti) vstupních dat, neboť umožňují výrazně snížit množství přijatých údajů nevhodného tvaru. Jde s nimi například zjistit, jestli hodnota zadaná do textového pole začíná alespoň třemi písmeny a podobné věci. O tom, jak vypadají už bylo napsáno dost, bohužel fakt je ten, že se dají naučit jen praxí. K praktickému pochopení regulárních výrazů snad přispěje i slíbený testík.
Další aktuální články na interval.cz
- 30 příkladů čistého a minimalistického navigačního menu
- Webové formuláře pro mobilní zařízení: moderní řešení
- Vývojář si jen s programováním nevystačí
- Začíná registrace účastníků konference INSPO 2010
- 25 rad, jak se stát úspěšným webdesignerem na vlastní noze
Tematicky související články
- Využití náhody v Javacriptu ve svůj prospěch
- Vyhledávání v textu stránky pomocí JavaScriptu
- Jednoduchý odpočet v JavaScriptu
- Slabikář JavaScriptu - konverze datových typů a priorita operátorů
- Slabikář JavaScriptu - ostatní události
Dejte vědět i ostatním o článku
Komentáře ke článku
Datum vložení: 03. Únor 2010, 09:37:48
Příklad 7 obsahuje chybu.
Datum vložení: 04. Únor 2010, 08:47:51
Ano, přesně tak. Zadanému výrazu neodpovídá žádné z nabízených řešení. Předpokládám, že výraz měl být (999){3}, popřípadě chyták 999{3,}.
Datum vložení: 05. Únor 2010, 08:41:53
Shark -> Proč si myslíte, že řetězec "999999999" nevyhoví RE "999{3}"? Já myslím, že je to v pořádku.
Datum vložení: 05. Únor 2010, 09:11:52
V příkladu 7 se hledá podřetězec (sic!) složený z pěti devítek. Jedna z možností obsahuje pět (a více) devítek.
Aby byl příklad opravdu špatně, muselo by se na začátek RE přidat ^ a na konec $, pak by se teprve hledala (a nenalezla) shoda s celým řetězcem.
Datum vložení: 05. Únor 2010, 11:34:48
Príklad 9 je zle napísaný:
[4-91]
23
terminál 1
miesto:
[4-91]
23
terminál 1
Datum vložení: 05. Únor 2010, 11:35:41
tak inak: [li][ol][4-91]
miesto: [li][4-91][ol]
Datum vložení: 05. Únor 2010, 12:18:03
Pavel Salvet: Přesně tak to je. Shark vymyslel "chyták", ale sám se do jednoho nechal chytit ;-)
Datum vložení: 06. Únor 2010, 10:08:11
Sakra, máte pravdu. Ani nevím proč jsem měl najednou u příkladu 7 pocit, že výrazu musí odpovídat celý řetězec.












