Jak jsme vidÄli, k oznaÄenà znakových tÅÃd se použÃvá zpÄtné lomÃtko \, napÅ. \d. V regulárnÃch výrazech je to tedy speciálnà znak (stejnÄ jako v bÄžných ÅetÄzcÃch).
V regulárnÃch výrazech majà speciálnà význam i jiné speciálnà znaky, napÅÃklad [ ] { } ( ) \ ^ $ . | ? * +. PoužÃvajà se k provádÄnà silnÄjÅ¡Ãho hledánÃ.
Nesnažte se si tento seznam zapamatovat â se vÅ¡emi tÄmito znaky se brzy setkáme a pak je budete znát jako své boty.
Ãnikový znak
ÅeknÄme, že chceme najÃt teÄku. Ne âlibovolný znakâ, ale skuteÄnou teÄku.
Abychom použili speciálnà znak jako bÄžný, uvedeme pÅed nÃm zpÄtné lomÃtko: \..
Tomu se také ÅÃká âúnikový znakâ.
PÅÃklad:
alert( "Kapitola 5.1".match(/\d\.\d/) ); // 5.1 (shoda!)
alert( "Kapitola 511".match(/\d\.\d/) ); // null (hledá opravdovou teÄku \.)
Závorky jsou také speciálnà znaky, takže pokud je chceme hledat, mÄli bychom použÃt \(. NásledujÃcà pÅÃklad hledá ÅetÄzec "g()":
alert( "function g()".match(/g\(\)/) ); // "g()"
Jestliže hledáme zpÄtné lomÃtko \, je to speciálnà znak v bÄžných ÅetÄzcÃch i v regulárnÃch výrazech, takže bychom je mÄli zdvojit.
alert( "1\\2".match(/\\/) ); // '\'
LomÃtko
Symbol lomÃtka '/' nenà speciálnà znak, ale v JavaScriptu se použÃvá k otevÅenà a uzavÅenà RV: /...vzor.../, takže bychom i pÅed nÃm mÄli uvést únikový znak.
Takto vypadá hledánà lomÃtka '/':
alert( "/".match(/\//) ); // '/'
Naproti tomu, jestliže nepoužÃváme /.../, ale vytváÅÃme nový RV pomocà new RegExp, nemusÃme uvádÄt únikový znak:
alert( "/".match(new RegExp("/")) ); // najde /
new RegExp
Jestliže vytváÅÃme regulárnà výraz pomocà new RegExp, nemusÃme uvést únikový znak pÅed /, ale musÃme jej uvést pÅed jinými znaky.
Uvažujme napÅÃklad tohle:
let rv = new RegExp("\d\.\d");
alert( "Kapitola 5.1".match(rv) ); // null
V jednom z pÅedchozÃch pÅÃkladů fungovalo podobné hledánà s /\d\.\d/, ale new RegExp("\d\.\d") nefunguje, proÄ?
Důvodem je, že zpÄtná lomÃtka jsou âspotÅebovánaâ ÅetÄzcem. Jak si možná vzpomÃnáme, bÄžné ÅetÄzce majà své vlastnà speciálnà znaky, napÅ. \n, a zpÄtné lomÃtko se použÃvá jako únikový znak.
Takto bude pochopeno "\d\.\d":
alert("\d\.\d"); // d.d
ÅetÄzcové uvozovky âspotÅebujÃâ zpÄtná lomÃtka a interpretujà je po svém, napÅÃklad:
\nâ vytvoÅà znak nového Åádku,\u1234â vytvoÅà znak s uvedeným kódem v Unicode,- â¦a když nenà žádný speciálnà význam, napÅÃklad
\dnebo\z, bude zpÄtné lomÃtko jednoduÅ¡e odstranÄno.
new RegExp tedy obdržà ÅetÄzec bez zpÄtných lomÃtek. Proto hledánà nefunguje!
Abychom to opravili, potÅebujeme dvojici zpÄtných lomÃtek, protože ÅetÄzcové uvozovky zmÄnà \\ na \:
let regÅetÄzec = "\\d\\.\\d";
alert(regÅetÄzec); // \d\.\d (teÄ je to správnÄ)
let rv = new RegExp(regÅetÄzec);
alert( "Kapitola 5.1".match(rv) ); // 5.1
ShrnutÃ
- Abychom mohli najÃt pÅÃmo speciálnà znaky
[ \ ^ $ . | ? * + ( ), musÃme pÅed nimi uvést zpÄtné lomÃtko\(âúnikový znakâ). - Pokud jsme uvnitÅ
/.../, musÃme uvést únikový znak i pÅed/(ale ne uvnitÅnew RegExp). - Když pÅedáváme ÅetÄzec do
new RegExp, musÃme zpÄtná lomÃtka zdvojit\\, protože ÅetÄzcové uvozovky jedno z nich spotÅebujÃ.
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â¦)