JavaScript, Regex a Unicode

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/.test("naïve") 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.