Únik, speciální znaky

Jak jsme viděli, zpětné lomítko \ se používá k označení tříd znaků, např. \d . Jde tedy o speciální znak v regulárních výrazech (stejně jako v běžných řetězcích).

Existují také další speciální znaky, které mají v regulárním výrazu zvláštní význam, například [ ] { } ( ) \ ^ $ . | ? * + . Používají se k výkonnějšímu vyhledávání.

Nesnažte se zapamatovat si seznam – brzy se budeme zabývat každým z nich a budete je znát automaticky nazpaměť.

Escapování

Řekněme, že chceme najít doslova tečku. Ne „jakýkoli znak“, ale pouze tečka.

Chcete-li použít speciální znak jako běžný, přidejte před něj zpětné lomítko:\. .

To se také nazývá „uniknutí postavy“.

Například:

alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1 (match!)
alert( "Chapter 511".match(/\d\.\d/) ); // null (looking for a real dot \.)

Závorky jsou také speciální znaky, takže pokud je chceme, měli bychom použít \( . Níže uvedený příklad hledá řetězec "g()" :

alert( "function g()".match(/g\(\)/) ); // "g()"

Pokud hledáme zpětné lomítko \ , je to speciální znak v běžných řetězcích i regulárních výrazech, takže bychom jej měli zdvojnásobit.

alert( "1\\2".match(/\\/) ); // '\'

Lomítko

Symbol lomítka '/' není speciální znak, ale v JavaScriptu se používá k otevření a zavření regulárního výrazu:/...pattern.../ , takže bychom tomu také měli uniknout.

Zde je to, co hledat lomítko '/' vypadá takto:

alert( "/".match(/\//) ); // '/'

Na druhou stranu, pokud nepoužíváme /.../ , ale vytvořte regulární výraz pomocí new RegExp , pak tomu nemusíme unikat:

alert( "/".match(new RegExp("/")) ); // finds /

nový RegExp

Pokud vytváříme regulární výraz s new RegExp , pak nemusíme escapovat / , ale je potřeba udělat nějaký jiný únik.

Zvažte například toto:

let regexp = new RegExp("\d\.\d");

alert( "Chapter 5.1".match(regexp) ); // null

Podobné vyhledávání v jednom z předchozích příkladů fungovalo 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 můžeme vzpomenout, běžné řetězce mají své vlastní speciální znaky, například \n a pro escapování se používá zpětné lomítko.

Zde je návod, jak je „\d.\d“ vnímáno:

alert("\d\.\d"); // d.d

Řetězcové uvozovky „spotřebovávají“ zpětná lomítka a interpretují je samostatně, například:

  • \n – se stane znakem nového řádku,
  • \u1234 – se stane znakem Unicode s takovým kódem,
  • …A když to nemá žádný zvláštní význam:jako \d nebo \z , pak se zpětné lomítko jednoduše odstraní.

Takže new RegExp získá řetězec bez zpětných lomítek. To je důvod, proč vyhledávání nefunguje!

Abychom to napravili, musíme zdvojit zpětná lomítka, protože uvozovky řetězců se změní na \\ do \ :

let regStr = "\\d\\.\\d";
alert(regStr); // \d\.\d (correct now)

let regexp = new RegExp(regStr);

alert( "Chapter 5.1".match(regexp) ); // 5.1

Shrnutí

  • Chcete-li vyhledat speciální znaky [ \ ^ $ . | ? * + ( ) doslova je musíme přidat zpětným lomítkem \ („unikni jim“).
  • Musíme také uniknout / pokud jsme uvnitř /.../ (ale ne uvnitř new RegExp ).
  • Při předávání řetězce do new RegExp , musíme zdvojit zpětná lomítka \\ , způsobí, že řetězcové uvozovky spotřebují jeden z nich.