Třídy postav

Zvažte praktický úkol – máme telefonní číslo jako "+7(903)-123-45-67" a musíme to převést na čistá čísla:79031234567 .

Za tímto účelem můžeme najít a odstranit vše, co není číslo. S tím mohou pomoci třídy postav.

třída znaků je speciální zápis, který odpovídá libovolnému symbolu z určité množiny.

Pro začátek se podívejme na třídu „číslice“. Zapisuje se jako \d a odpovídá „jakékoli jediné číslici“.

Najdeme například první číslici v telefonním čísle:

let str = "+7(903)-123-45-67";

let regexp = /\d/;

alert( str.match(regexp) ); // 7

Bez příznaku g , regulární výraz hledá pouze první shodu, tedy první číslici \d .

Přidejme g příznak pro vyhledání všech číslic:

let str = "+7(903)-123-45-67";

let regexp = /\d/g;

alert( str.match(regexp) ); // array of matches: 7,9,0,3,1,2,3,4,5,6,7

// let's make the digits-only phone number of them:
alert( str.match(regexp).join('') ); // 79031234567

To byla třída znaků pro číslice. Existují i ​​další třídy postav.

Nejpoužívanější jsou:

\d („d“ je z „číslice“)
Číslice:znak z 0 na 9 .
\s („s“ je z „mezera“)
Symbol mezery:zahrnuje mezery, tabulátory \t , nové řádky \n a několik dalších vzácných znaků, jako je \v , \f a \r .
\w („w“ je ze „slova“)
Výslovný znak:buď písmeno latinské abecedy, číslice nebo podtržítko _ . Písmena jiná než latinka (jako azbuka nebo hindština) nepatří do \w .

Například \d\s\w znamená „číslici“ následovanou „mezerou“ následovanou „slovným znakem“, například 1 a .

Regulační výraz může obsahovat běžné symboly i třídy znaků.

Například CSS\d odpovídá řetězci CSS s číslicí za ní:

let str = "Is there CSS4?";
let regexp = /CSS\d/

alert( str.match(regexp) ); // CSS4

Také můžeme použít mnoho tříd znaků:

alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'

Shoda (každá třída znaků regulárního výrazu má odpovídající výsledný znak):

Inverzní třídy

Pro každou třídu znaků existuje „inverzní třída“, označená stejným písmenem, ale velkým písmenem.

„Inverzní“ znamená, že odpovídá všem ostatním znakům, například:

\D
Nečíslicový:libovolný znak kromě \d , například dopis.
\S
Bez mezery:jakýkoli znak kromě \s , například dopis.
\W
Neslovný znak:cokoliv kromě \w , např. písmeno nebo mezera mimo latinku.

Na začátku kapitoly jsme viděli, jak vytvořit telefonní číslo pouze s číslem z řetězce jako +7(903)-123-45-67 :najít všechny číslice a spojit je.

let str = "+7(903)-123-45-67";

alert( str.match(/\d/g).join('') ); // 79031234567

Alternativní, kratší způsob je najít nečíslice \D a odeberte je z řetězce:

let str = "+7(903)-123-45-67";

alert( str.replace(/\D/g, "") ); // 79031234567

Tečka je „jakýkoli znak“

Tečka . je speciální třída znaků, která odpovídá „jakémukoli znaku kromě nového řádku“.

Například:

alert( "Z".match(/./) ); // Z

Nebo uprostřed regulárního výrazu:

let regexp = /CS.4/;

alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (space is also a character)

Vezměte prosím na vědomí, že tečka znamená „jakýkoli znak“, ale nikoli „nepřítomnost znaku“. Musí existovat znak, který tomu odpovídá:

alert( "CS4".match(/CS.4/) ); // null, no match because there's no character for the dot

Tečka jako doslova jakýkoli znak s příznakem „s“

Ve výchozím nastavení tečka neodpovídá znaku nového řádku \n .

Například regulární výraz A.B odpovídá A a poté B s libovolným znakem mezi nimi, kromě nového řádku \n :

alert( "A\nB".match(/A.B/) ); // null (no match)

Existuje mnoho situací, kdy bychom chtěli, aby tečka znamenala doslova „jakýkoli znak“, včetně nového řádku.

To je příznak s dělá. Pokud jej má regulární výraz, pak tečku . odpovídá doslova libovolnému znaku:

alert( "A\nB".match(/A.B/s) ); // A\nB (match!)
Není podporováno v IE

s příznak není v IE podporován.

Naštěstí existuje alternativa, která funguje všude. Můžeme použít regulární výraz jako [\s\S] aby odpovídaly „jakémukoli znaku“ (tento vzor bude popsán v článku Sady a rozsahy [...]).

alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (match!)

Vzor [\s\S] doslova říká:„mezerník NEBO ne znak mezera“. Jinými slovy „cokoli“. Mohli bychom použít další pár doplňkových tříd, jako je [\d\D] , to je jedno. Nebo dokonce [^] – znamená to, že odpovídá libovolnému znaku kromě ničeho.

Tento trik můžeme také použít, pokud chceme oba druhy „teček“ ve stejném vzoru:skutečná tečka . chovat se běžným způsobem („bez nového řádku“) a také způsob, jak porovnat „jakýkoli znak“ s [\s\S] nebo podobně.

Dávejte pozor na mezery

Prostorům obvykle věnujeme malou pozornost. Pro nás řetězce 1-5 a 1 - 5 jsou téměř totožné.

Pokud však regulární výraz nebere v úvahu mezery, nemusí fungovat.

Zkusme najít číslice oddělené pomlčkou:

alert( "1 - 5".match(/\d-\d/) ); // null, no match!

Opravme to přidáním mezer do regulárního výrazu \d - \d :

alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, now it works
// or we can use \s class:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, also works

Mezera je znak. Je stejně důležitý jako jakákoli jiná postava.

Nemůžeme přidávat ani odstraňovat mezery z regulárního výrazu a očekáváme, že bude fungovat stejně.

Jinými slovy, v regulárním výrazu záleží na všech znacích, i na mezerách.

Shrnutí

Existují následující třídy znaků:

  • \d – číslice.
  • \D – bez číslic.
  • \s – symboly mezer, tabulátory, nové řádky.
  • \S – všechny kromě \s .
  • \w – Latinská písmena, číslice, podtržítko '_' .
  • \W – všechny kromě \w .
  • . – libovolný znak, pokud má regulární výraz 's' příznak, jinak jakýkoli kromě nového řádku \n .

…Ale to není vše!

Kódování Unicode, které JavaScript používá pro řetězce, poskytuje mnoho vlastností pro znaky, například:do jakého jazyka písmeno patří (pokud je to písmeno), je to interpunkční znaménko atd.

Můžeme vyhledávat i podle těchto vlastností. To vyžaduje příznak u , který je popsán v dalším článku.