ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ Π² Firefox JavaScript-Π΄Π²ΠΈΠΆΠΎΠΊ SpiderMonkey
ΠΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π΄Π²ΠΈΠΆΠΎΠΊ RegExp Π² SpiderMonkey ΠΎΡΠΎΡΠΌΠ»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ ΠΈ ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΠΌ Π΄Π»Ρ Π·Π°ΠΌΠ΅Π½Ρ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ΠΎΠ²ΡΡ Π±Π°Π·Ρ. ΠΠΎΠ΄ΡΠ»ΡΠ½ΠΎΡΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π² 2014 Π³ΠΎΠ΄Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ Π² Firefox RegExp-Π΄Π²ΠΈΠΆΠΎΠΊ YARR Π½Π° ΡΠΎΡΠΊ Π΄Π²ΠΈΠΆΠΊΠ° Irregexp ΠΈΠ· V8. Irregexp Π·Π°Π²ΡΠ·Π°Π½ Π½Π° API V8, ΠΏΡΠΈΠ²ΡΠ·Π°Π½ ΠΊ ΡΠ±ΠΎΡΡΠΈΠΊΡ ΠΌΡΡΠΎΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ Π΄Π»Ρ V8 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ. Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π°Π΄Π°ΠΏΡΠ°ΡΠΈΠΈ ΠΊ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌΡ API SpiderMonkey Π² 2014 Π³ΠΎΠ΄Ρ Π΄Π²ΠΈΠΆΠΎΠΊ Irregexp ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π»ΠΈ, Π° ΠΏΠΎΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ»Π°Π³ β\uβ, ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΈ Π΅Π³ΠΎ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΈΡ
ΡΠ΅ΡΡΡΡΠΎΠ². Π‘ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ ECMAScript 2018 Π½ΠΎΠ²ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
Ρ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΌΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Mozilla Π·Π°Π΄ΡΠΌΠ°Π»ΠΈΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈΠ· Irregexp. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΡ
ΠΎΠ΄Π° Π±ΡΠ»Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΎΠ±Π²ΡΠ·ΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² SpiderMonkey ΠΏΠΎΡΡΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Irregexp (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ²ΠΎΠ΄ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π·Π°ΠΌΠ΅Π½Π΅ Π±Π»ΠΎΠΊΠΎΠ² Β«#includeΒ»).
ΠΠ±Π²ΡΠ·ΠΊΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π»Ρ Irregexp Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ V8, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡΡ ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ΅ΠΉ ΠΊΠΎΠ΄Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡΡ, Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΊΠΎΠ΄Π° ΠΈ ΡΡΡΡΠΊΡΡΡ SpiderMonkey.
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ RegExp-Π΄Π²ΠΈΠΆΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π² Firefox ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ°ΠΊΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ Π³ΡΡΠΏΠΏΡ (named captures), ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² Unicode-ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΡΠ»Π°Π³ dotAll ΠΈ ΡΠ΅ΠΆΠΈΠΌ Lookbehind:
-
ΠΠΌΠ΅Π½ΡΠ²Π°Π½ΠΈ Π³ΡΡΠΏΠΈ Π²ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΎΠ²ΡΠ·Π΅ΡΠ΅ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ Π½ΠΈΠ·Π° ΡΡΠΎ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°Π°Ρ ΡΠΎ ΡΠ΅Π³ΡΠ»Π°ΡΠ΅Π½ ΠΈΠ·ΡΠ°Π· ΡΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΈΠΌΠΈΡΠ° Π½Π°ΠΌΠ΅ΡΡΠΎ ΡΠ΅ΡΠΈΡΠΊΠΈ Π±ΡΠΎΠ΅Π²ΠΈ Π½Π° ΡΠΎΠ²ΠΏΠ°ΡΠ°ΡΠ° (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΌΠ΅ΡΡΠΎ β/(\d{4})-(\d{2})-(\d{ 2})/β ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ β/( ? \d{4})-(? \d{2})-(? \d{2})/β ΠΈ ΠΏΡΠΈΡΡΠ°ΠΏΠ΅ΡΠ΅ Π΄ΠΎ Π³ΠΎΠ΄ΠΈΠ½Π°ΡΠ° Π½Π΅ ΠΏΡΠ΅ΠΊΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ[1], ΡΡΠΊΡ ΠΏΡΠ΅ΠΊΡ result.groups.year). -
ΠΠ΅Π³ΡΡΠ²ΠΎ ΠΎΠ΄ ΡΠ°ΡΠΎΠ²ΠΈ Π£Π½ΠΈΠΊΠΎΠ΄ Π·Π½Π°ΡΠΈΡΠ΅ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ \p{...} ΠΈ \P{...}, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, \p{Number} Π³ΠΈ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ½ΠΈ Π·Π½Π°ΡΠΈ ΡΡΠΎ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π°Π°Ρ Π±ΡΠΎΠ΅Π²ΠΈ (Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ ΡΠΈΠΌΠ±ΠΎΠ»ΠΈ ΠΊΠ°ΠΊΠΎ β ), \p{ΠΠ·Π±ΡΡΠ½ΠΎ} - Π±ΡΠΊΠ²ΠΈ (Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ Ρ ΠΈΠ΅ΡΠΎΠ³Π»ΠΈΡΠΈ ), \p{ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°} β ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠΊΠΈ ΡΠΈΠΌΠ±ΠΎΠ»ΠΈ ΠΈΡΠ½. - ΠΠ½Π°ΠΌΠ΅
ΡΠΎΡΠΊΠ°Π‘ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π° ΠΏΠ°Π»Π΅ΡΠ΅ Π½Π° ΠΌΠ°ΡΠΊΠ°ΡΠ° β.β. Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ Π·Π½Π°ΡΠΈ Π·Π° Π΄ΠΎΠ²ΠΎΠ΄ Π½Π° Π»ΠΈΠ½ΠΈΡΠ°. - Π Π΅ΠΆΠΈΠΌ
ΠΠ»Π΅Π΄Π°Ρ ΠΏΠΎΠ·Π°Π΄ΠΈ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΎΠ΄ΡΠ΅Π΄ΠΈΡΠ΅ Π²ΠΎ ΡΠ΅Π³ΡΠ»Π°ΡΠ΅Π½ ΠΈΠ·ΡΠ°Π· Π΄Π΅ΠΊΠ° Π΅Π΄Π½Π° ΡΠ΅ΠΌΠ° ΠΌΡ ΠΏΡΠ΅ΡΡ ΠΎΠ΄ΠΈ Π½Π° Π΄ΡΡΠ³Π° (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ²ΠΏΠ°ΡΠ°ΡΠ΅ Π½Π° ΠΈΠ·Π½ΠΎΡ ΠΎΠ΄ Π΄ΠΎΠ»Π°Ρ Π±Π΅Π· Π΄Π° Π³ΠΎ ΡΠ°ΡΠΈΡΠ΅ Π·Π½Π°ΠΊΠΎΡ Π·Π° Π΄ΠΎΠ»Π°Ρ).
ΠΡΠΎΠ΅ΠΊΡ Π±ΡΠ» ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ½ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² V8, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΠΏΡΠΎΠ²Π΅Π»ΠΈ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Irregexp ΠΎΡ V8, ΠΈ Π²ΡΠ½Π΅ΡΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π½Π° Π±Π°Π·Π΅ SpiderMonkey, Π² ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ Π±Π»ΠΎΠΊΠΈ Β«#ifdefΒ». Π‘ΠΎΡΡΡΠ΄Π½ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ²ΡΠ³ΠΎΠ΄Π½ΡΠΌ. Π‘ΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Mozilla ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ Π² Irregexp ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΡΡΡΠ°Π½ΡΡΡΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅
ΠΠ·Π²ΠΎΡ: opennet.ru