Uvažujme praktickou úlohu: máme telefonnà ÄÃslo, napÅÃklad "+7(903)-123-45-67", a potÅebujeme je pÅevést na Äisté ÄÃslo obsahujÃcà jen ÄÃslice: 79031234567.
Můžeme to udÄlat tak, že najdeme a odstranÃme vÅ¡e, co nenà ÄÃslice. Mohou nám s tÃm pomoci znakové tÅÃdy.
Znaková tÅÃda je speciálnà zápis, kterému odpovÃdajà vÅ¡echny symboly z urÄité množiny.
Na zaÄátku vysvÄtlÃme tÅÃdu âÄÃslicâ. Zapisuje se \d a odpovÃdá âjedné libovolné ÄÃsliciâ.
NajdÄme napÅÃklad prvnà ÄÃslici v telefonnÃm ÄÃsle:
let ÅetÄzec = "+7(903)-123-45-67";
let rv = /\d/;
alert( ÅetÄzec.match(rv) ); // 7
Bez pÅÃznaku g regulárnà výraz hledá pouze prvnà shodu, kterou je prvnà ÄÃslice \d.
PÅidejme pÅÃznak g, abychom naÅ¡li vÅ¡echny ÄÃslice:
let ÅetÄzec = "+7(903)-123-45-67";
let rv = /\d/g;
alert( ÅetÄzec.match(rv) ); // pole shod: 7,9,0,3,1,2,3,4,5,6,7
// vytvoÅme z nich telefonnà ÄÃslo skládajÃcà se jen z ÄÃslic:
alert( ÅetÄzec.match(rv).join('') ); // 79031234567
To byla znaková tÅÃda pro ÄÃslice. Existujà i jiné znakové tÅÃdy.
NejpoužÃvanÄjšà jsou:
\d(âdâ od slova âdigitâ, ÄÃslice)- ÄÃslice: znak od
0do9. \s(âsâ od slova âspaceâ, mezera)- Mezerový symbol: patÅà sem mezery, tabelátory
\t, nové Åádky\na nÄkolik dalÅ¡Ãch vzácných znaků, napÅ.\v,\fa\r. \w(âwâ od slova âwordâ, slovo)- âSlovnÃâ znak: pÃsmeno latinské abecedy, ÄÃslice nebo podtržÃtko
_. Znaky nelatinských abeced (napÅ. kyrilice nebo hindi) (vÄetnÄ pÃsmen s diakritickými znaménky â pozn. pÅekl.) do\wnepatÅÃ.
NapÅÃklad \d\s\w znamená âÄÃsliciâ následovanou âmezerovým znakemâ následovaným âslovnÃm znakemâ, napÅÃklad 1 a.
Regulárnà výraz může obsahovat regulárnà symboly a znakové tÅÃdy souÄasnÄ.
NapÅÃklad výrazu CSS\d odpovÃdá ÅetÄzec CSS následovaný ÄÃslicÃ:
let ÅetÄzec = "Je tam CSS4?";
let rv = /CSS\d/
alert( ÅetÄzec.match(rv) ); // CSS4
Můžeme použÃt i vÃce znakových tÅÃd najednou:
alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
Shoda (každá znaková tÅÃda regulárnÃho výrazu má ve výsledku odpovÃdajÃcà znak):
Inverznà tÅÃdy
Ke každé znakové tÅÃdÄ existuje âinverznà tÅÃdaâ, oznaÄovaná stejným, ale velkým pÃsmenem.
âInverznÃâ znamená, že odpovÃdá vÅ¡em ostatnÃm znakům, napÅÃklad:
\D- NeÄÃslice: jakýkoli znak kromÄ
\d, napÅÃklad pÃsmeno. \S- Nemezerový znak: jakýkoli znak kromÄ
\s, napÅÃklad pÃsmeno. \W- Neslovnà znak: cokoli kromÄ
\w, napÅÃklad nelatinské pÃsmeno nebo mezera.
Na zaÄátku kapitoly jsme vidÄli, jak z ÅetÄzce jako +7(903)-123-45-67 vytvoÅit telefonnà ÄÃslo obsahujÃcà pouze ÄÃslice: najdeme vÅ¡echny ÄÃslice a spojÃme je.
let ÅetÄzec = "+7(903)-123-45-67";
alert( ÅetÄzec.match(/\d/g).join('') ); // 79031234567
AlternativnÃm, kratÅ¡Ãm způsobem je najÃt vÅ¡echny neÄÃslicové znaky \D a odstranit je z ÅetÄzce:
let ÅetÄzec = "+7(903)-123-45-67";
alert( ÅetÄzec.replace(/\D/g, "") ); // 79031234567
TeÄka znamená âlibovolný znakâ
TeÄka . je speciálnà znaková tÅÃda, které odpovÃdá âjakýkoli znak kromÄ konce Åádkuâ.
PÅÃklad:
alert( "Z".match(/./) ); // Z
Nebo uprostÅed regulárnÃho výrazu:
let rv = /CS.4/;
alert( "CSS4".match(rv) ); // CSS4
alert( "CS-4".match(rv) ); // CS-4
alert( "CS 4".match(rv) ); // CS 4 (mezera je také znak)
ProsÃme vÅ¡imnÄte si, že teÄka znamená âlibovolný znakâ, ale ne âžádný znakâ. Musà tam být znak, který jà bude odpovÃdat:
alert( "CS4".match(/CS.4/) ); // null, beze shody, protože pro teÄku tam nenà žádný znak
TeÄka jako doslova jakýkoli znak s pÅÃznakem âsâ
StandardnÄ teÄce neodpovÃdá znak nového Åádku \n.
NapÅÃklad regulárnÃmu výrazu A.B odpovÃdá A a pak B s libovolným znakem mezi nimi kromÄ nového Åádku \n:
alert( "A\nB".match(/A.B/) ); // null (nenà shoda)
V mnoha situacÃch bychom chtÄli, aby teÄka znamenala doslova âjakýkoli znakâ vÄetnÄ nového Åádku.
To zajistà pÅÃznak s. Pokud ho regulárnà výraz obsahuje, pak teÄka . znamená doslova libovolný znak:
alert( "A\nB".match(/A.B/s) ); // A\nB (shoda!)
PÅÃznak s nenà podporován v IE.
NaÅ¡tÄstà je tady alternativa, která funguje vÅ¡ude. K nalezenà âlibovolného znakuâ můžeme použÃt regulárnà výraz jako [\s\S] (tento vzor vysvÄtlÃme v Älánku Množiny a rozsahy [...]).
alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (shoda!)
Vzor [\s\S] ÅÃká doslova: âmezerový znak NEBO nemezerový znakâ. Jinými slovy: âcokoliâ. Můžeme použÃt i jinou dvojici doplÅujÃcÃch se tÅÃd, napÅ. [\d\D], na tom nezáležÃ. Nebo dokonce vzor [^] â tomu odpovÃdá jakýkoli znak kromÄ Å¾Ã¡dného.
Tento trik můžeme použÃt i tehdy, když chceme ve stejném vzoru mÃt oba druhy âteÄekâ: obvyklou teÄku . chovajÃcà se bÄžným způsobem (âkromÄ nového Åádkuâ) a také způsob, jak najÃt âlibovolný znakâ pomocà vzoru [\s\S] nebo podobného.
Mezerám obvykle nevÄnujeme velkou pozornost. ÅetÄzce 1-5 a 1 - 5 jsou pro nás témÄÅ stejné.
Pokud vÅ¡ak regulárnà výraz nebude brát mezery v úvahu, může fungovat nesprávnÄ.
Zkusme najÃt ÄÃslice oddÄlené pomlÄkou:
alert( "1 - 5".match(/\d-\d/) ); // null, nenà shoda!
Opravme to pÅidánÃm mezer do regulárnÃho výrazu \d - \d:
alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, nynà funguje
// nebo můžeme použÃt tÅÃdu \s:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, také funguje
Mezera je znak. Je stejnÄ důležitý jako kterýkoli jiný znak.
Nemůžeme do regulárnÃho výrazu pÅidat nebo z nÄj odstranit mezery a oÄekávat, že bude fungovat stále stejnÄ.
Jinými slovy, v regulárnÃm výrazu záležà na vÅ¡ech znacÃch vÄetnÄ mezer.
ShrnutÃ
Existujà následujÃcà znakové tÅÃdy:
\dâ ÄÃslice.\Dâ neÄÃslice.\sâ mezerové symboly, tabelátory, nové Åádky.\Sâ vÅ¡echno kromÄ\s.\wâ latinská pÃsmena, ÄÃslice, podtržÃtko'_'.\Wâ vÅ¡echno kromÄ\w..â s pÅÃznakem's'libovolný znak, bez nÄj libovolný znak kromÄ nového Åádku\n.
â¦To vÅ¡ak nenà vÅ¡echno!
Kódovánà Unicode, které JavaScript použÃvá pro ÅetÄzce, poskytuje mnoho vlastnostà znaků, napÅÃklad: do kterého jazyka znak patÅà (pokud je to pÃsmeno), zda je to interpunkÄnà znaménko a podobnÄ.
I podle tÄchto vlastnostà můžeme vyhledávat. PotÅebujeme k tomu pÅÃznak u, který probereme v pÅÃÅ¡tÃm Älánku.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)