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
na9
. \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ě.
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.