Ne všechny třídy zkrácených znaků a další syntaxe regulárního výrazu JavaScriptu podporují Unicode. V některých případech může být důležité přesně vědět, jaké tokeny se shodují, a to je to, co tento příspěvek prozkoumá.
Podle ECMA-262 3rd Edition, \s
, \S
, .
, ^
a $
používat interpretace mezera založené na Unicode a nový řádek , zatímco \d
, \D
, \w
, \W
, \b
a \B
používejte pouze ASCII interpretace číslice , znak slova a hranice slova (např. /a\b/.
vrátí true
). Skutečné implementace prohlížečů se v těchto bodech často liší. Například Firefox 2 bere v úvahu \d
a \D
podporovat Unicode, zatímco Firefox 3 tuto chybu opravuje – dělá \d
ekvivalentní [0-9]
jako u většiny ostatních prohlížečů.
Zde jsou znovu dotčené tokeny spolu s jejich definicemi:
\d
— Číslice.\s
— Mezera.\w
— Slovní znaky.\D
— Všechny kromě číslic.\S
— Všechny kromě mezer.\W
— Všechny kromě slovních znaků..
— Všechny kromě nových řádků.^
(s/m
) — Pozice na začátku řetězce a těsně za novými řádky.$
(s/m
) — Pozice na konci řetězce a těsně před novými řádky.\b
— Polohy hranic slov.\B
— Ne pozice na hranicích slov.
Všechny výše uvedené jsou standardní v příchutích regulárních výrazů odvozených z Perlu. Nicméně význam pojmů číslice , mezera , znak slova , hranice slova a nový řádek závisí na variantě regulárních výrazů, znakové sadě a platformě, kterou používáte, takže zde jsou oficiální významy JavaScriptu, jak se vztahují na regulární výrazy:
- Číslice — Pouze znaky 0-9.
- Mezerník — Tabulátor, posun řádku, svislý tabulátor, posun formuláře, návrat vozíku, mezera, mezera bez konce, oddělovač řádků, oddělovač odstavců a „jakýkoli jiný „oddělovač mezer“ v Unicode“.
- Slovní znak — Pouze znaky A–Z, a–z, 0–9 a _.
- Hranice slova — Pozice mezi znakem slova a jiný než slovní znak .
- Nový řádek — Znaky pro posun řádku, návrat vozíku, oddělovač řádků a oddělovač odstavců.
Zde jsou opět znaky nového řádku s jejich kódy znaků:
\u000a
— Odřádkování —\n
\u000d
— Vrácení vozíku —\r
\u2028
— Oddělovač řádků\u2029
— Oddělovač odstavců
Všimněte si, že návrhy ECMAScript 4 udávají, že řídicí znak C1/Unicode NEL „další řádek“ (\u0085
) bude v tomto standardu rozpoznán jako další znak nového řádku. Všimněte si také, že ačkoli CRLF (návrat vozíku následovaný posunem řádku) je ve většině kontextů považován za jednu sekvenci nového řádku, /\r^$\n/m.test("\r\n")
vrátí true
.
Pokud jde o mezery, ECMA-262 3rd Edition používá interpretaci založenou na základní vícejazyčné rovině Unicode, od verze 2.1 nebo novější standardu Unicode. Níže jsou uvedeny znaky, které by měly odpovídat \s
podle ECMA-262 3rd Edition a Unicode 5.1:
\u0009
— Tab —\t
\u000a
— Odřádkování —\n
— (znak nového řádku)\u000b
— Vertikální karta —\v
\u000c
— Zdroj formuláře —\f
\u000d
— Vrácení vozíku —\r
— (znak nového řádku)\u0020
— Vesmír\u00a0
— Nepřerušovaný prostor\u1680
— Oghamská značka mezer\u180e
— Mongolský oddělovač samohlásek\u2000
— En quad\u2001
— Em quad\u2002
— En space\u2003
— Em prostor\u2004
— Prostor tři na em\u2005
— Prostor pro čtyři na em\u2006
— Prostor šest na em\u2007
— Figurový prostor\u2008
— Interpunkční mezera\u2009
— Tenký prostor\u200a
— Prostor pro vlasy\u2028
— Oddělovač řádků — (znak nového řádku)\u2029
— Oddělovač odstavců — (znak nového řádku)\u202f
— Úzká mezera bez přerušení\u205f
— Střední matematický prostor\u3000
— Ideografický prostor
Chcete-li otestovat, které znaky nebo pozice odpovídají všem zde zmíněným tokenům ve vašem prohlížeči, přečtěte si článek JavaScript Regex a Unicode testy . Všimněte si, že Firefox 2.0.0.11, IE 7 a Safari 3.0.3 beta všechny mají některé testy špatně.
Aktualizace: Můj nový plugin Unicode pro XRegExp umožňuje snadno spárovat kategorie Unicode, skripty a bloky v regulárních výrazech JavaScriptu.