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