Пошук усіх рэгулярных выразаў заўсёды быў O(n²) | Mewayz Blog Skip to main content
Hacker News

Пошук усіх рэгулярных выразаў заўсёды быў O(n²)

Каментарыі

1 min read Via iev.ee

Mewayz Team

Editorial Team

Hacker News

Схаваны кошт супастаўлення ўзораў

Для распрацоўшчыкаў рэгулярныя выразы (рэгулярныя выразы) з'яўляюцца незаменным інструментам, швейцарскім ножыкам для аналізу, праверкі і здабывання інфармацыі з тэксту. Ад праверкі фарматаў электроннай пошты да сканіравання даных з журналаў, рэгулярны выраз - гэта галоўнае рашэнне. Аднак пад гэтым магутным фасадам хаваецца пастка прадукцыйнасці, якая пакутуе ад сістэм на працягу дзесяцігоддзяў: у найгоршым выпадку складанасць пошуку ўсіх супадзенняў у радку складае O(n²). Гэтая квадратычная складанасць часу азначае, што па меры лінейнага росту ўваходнага радка час апрацоўкі можа расці ў геаметрычнай прагрэсіі, што прыводзіць да нечаканых запаволенняў, вычарпання рэсурсаў і з'явы, вядомай як ReDoS (адмова ў абслугоўванні рэгулярнага выразу). Разуменне гэтага абмежавання з'яўляецца першым крокам да стварэння больш надзейных і эфектыўных прыкладанняў.

Чаму рэгулярны выраз адпавядае O(n²)? Праблема вяртання назад

Корань складанасці O(n²) ляжыць у механізме, які выкарыстоўваюць большасць традыцыйных механізмаў рэгулярных выразаў: зваротнае адсочванне. Калі механізм рэгулярных выразаў, напрыклад, у Perl, Python або Java, спрабуе знайсці ўсе магчымыя супадзенні, ён не проста скануе радок адзін раз. Ён даследуе розныя шляхі. Разгледзім просты шаблон накшталт "(a+)+b", які прымяняецца да радка, у асноўным з "a", напрыклад "aaaaaaaaac". Рухавік прагна супастаўляе ўсе "а" з першым "а+", потым спрабуе супаставіць апошнюю "б". Калі гэта не атрымліваецца, ён вяртаецца назад - не супадаючы з апошнім "а" і спрабуючы квантар "+" на знешняй групе. Гэты працэс паўтараецца, прымушаючы рухавік спрабаваць усе магчымыя камбінацыі таго, як можна згрупаваць "а", што прыводзіць да камбінацыйнага выбуху магчымасцей. Колькасць шляхоў, якія механізм павінен даследаваць, можа быць прапарцыянальны квадрату даўжыні радка, такім чынам, O(n²).

  • Прагныя квантыфікатары: шаблоны, такія як `.*` або `.+`, першапачаткова спажываюць як мага больш тэксту, што прыводзіць да шырокага вяртання назад, калі наступныя часткі шаблону не супадаюць.
  • Укладзеныя квантары: Выразы накшталт `(a+)+` або `(a*a*)*` ствараюць экспанентную колькасць спосабаў раздзялення ўваходнага радка, значна павялічваючы час апрацоўкі.
  • Неадназначныя шаблоны: калі радок можа быць супастаўлены некалькімі спосабамі, якія перакрываюцца, механізм павінен праверыць кожную магчымасць, каб знайсці ўсе супадзенні.

Уплыў у рэальным свеце: больш, чым проста запаволенне

Гэта не толькі акадэмічны клопат. Неэфектыўны рэгулярны выраз можа мець сур'ёзныя наступствы ў вытворчых асяроддзях. Здавалася б, бяскрыўдная праверка праверкі даных можа стаць вузкім месцам пры апрацоўцы вялікіх файлаў або апрацоўцы вялікіх аб'ёмаў уводу карыстальнікам. Самым небяспечным вынікам з'яўляецца ReDoS-атака, калі зламыснік забяспечвае старанна створаны радок, які запускае рэгулярны выраз вэб-праграмы ў найгоршым выпадку, фактычна падвешваючы сервер і робячы яго недаступным для законных карыстальнікаў. Для прадпрыемстваў гэта азначае прастой, страту прыбытку і пашкоджанне рэпутацыі. Пры пабудове складаных сістэм, асабліва тых, якія апрацоўваюць ненадзейныя даныя, усведамленне гэтых падводных камянёў рэгулярных выразаў з'яўляецца найважнейшай часткай бяспекі і аўдыту прадукцыйнасці.

"Аднойчы ў нас было невялікае абнаўленне канфігурацыі, якое ўвяло рэгулярны выраз для аналізу радкоў карыстальніцкага агента. Пры нармальнай нагрузцы гэта было добра. Але падчас усплёску трафіку гэта выклікала каскадны збой, які спыніў працу нашага API на некалькі хвілін. Вінаватым быў рэгулярны выраз O(n²), пра які мы нават не ведалі". - Старэйшы інжынер DevOps

Стварэнне больш разумных сістэм з Mewayz

Такім чынам, як нам выйсці за межы гэтага фундаментальнага абмежавання? Рашэнне прадугледжвае спалучэнне лепшых інструментаў і разумнейшых архітэктурных рашэнняў. Па-першае, распрацоўшчыкі могуць выкарыстоўваць аналізатары рэгулярных выразаў, каб вызначыць праблемныя шаблоны і перапісаць іх, каб яны былі больш эфектыўнымі (напрыклад, з выкарыстаннем квантараў прыналежнасці або атамных груп). Для найвышэйшай прадукцыйнасці існуюць альтэрнатыўныя алгарытмы, якія гарантуюць лінейны час, O(n), для супадзення з шаблонам, хоць яны радзей сустракаюцца ў стандартных бібліятэках.

Менавіта тут такая модульная бізнес-АС, як Mewayz, дае значную перавагу. Mewayz дазваляе падзяляць і кантраляваць важныя працэсы. Замест таго, каб мець маналітнае прыкладанне, у якім адзін павольны рэгулярны выраз можа скалечыць усю сістэму, вы можаце разгарнуць спецыяльны ізаляваны мікрасэрвіс для аналізу і праверкі даных. Калі ўзнікае праблема з прадукцыйнасцю, яна ўтрымліваецца і можа быць вырашана без уплыву на іншыя бізнес-аперацыі. Акрамя таго, інструменты назірання на платформе Mewayz могуць дапамагчы вам вызначыць гэтыя недахопы, перш чым яны паўплываюць на вашых кліентаў, ператвараючы патэнцыйны крызіс у задачу аптымізацыі, якую можна кіраваць. Абапіраючыся на гнуткую і назіральную аснову, вы гарантуеце, што ваша бізнес-логіка, уключаючы складаную апрацоўку тэксту, застанецца прадукцыйнай і ўстойлівай.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

Часта задаюць пытанні

Схаваны кошт супастаўлення ўзораў

Для распрацоўшчыкаў рэгулярныя выразы (рэгулярныя выразы) з'яўляюцца незаменным інструментам, швейцарскім ножыкам для аналізу, праверкі і здабывання інфармацыі з тэксту. Ад праверкі фарматаў электроннай пошты да сканіравання даных з журналаў, рэгулярны выраз - гэта галоўнае рашэнне. Аднак пад гэтым магутным фасадам хаваецца пастка прадукцыйнасці, якая пакутуе ад сістэм на працягу дзесяцігоддзяў: у найгоршым выпадку складанасць пошуку ўсіх супадзенняў у радку складае O(n²). Гэтая квадратычная складанасць часу азначае, што па меры лінейнага росту ўваходнага радка час апрацоўкі можа расці ў геаметрычнай прагрэсіі, што прыводзіць да нечаканых запаволенняў, вычарпання рэсурсаў і з'явы, вядомай як ReDoS (адмова ў абслугоўванні рэгулярнага выразу). Разуменне гэтага абмежавання з'яўляецца першым крокам да стварэння больш надзейных і эфектыўных прыкладанняў.

Чаму рэгулярны выраз адпавядае O(n²)? Праблема вяртання назад

Корань складанасці O(n²) ляжыць у механізме, які выкарыстоўваюць большасць традыцыйных механізмаў рэгулярных выразаў: зваротнае адсочванне. Калі механізм рэгулярных выразаў, напрыклад, у Perl, Python або Java, спрабуе знайсці ўсе магчымыя супадзенні, ён не проста скануе радок адзін раз. Ён даследуе розныя шляхі. Разгледзім просты шаблон накшталт "(a+)+b", які прымяняецца да радка, у асноўным з "a", напрыклад "aaaaaaaaac". Рухавік прагна супастаўляе ўсе "а" з першым "а+", потым спрабуе супаставіць апошнюю "б". Калі гэта не атрымліваецца, ён вяртаецца назад - не супадаючы з апошнім "а" і спрабуючы квантар "+" на знешняй групе. Гэты працэс паўтараецца, прымушаючы рухавік спрабаваць усе магчымыя камбінацыі таго, як можна згрупаваць "а", што прыводзіць да камбінацыйнага выбуху магчымасцей. Колькасць шляхоў, якія механізм павінен даследаваць, можа быць прапарцыянальны квадрату даўжыні радка, такім чынам, O(n²).

Уздзеянне ў рэальным свеце: больш, чым проста запаволенне

Гэта не толькі акадэмічны клопат. Неэфектыўны рэгулярны выраз можа мець сур'ёзныя наступствы ў вытворчых асяроддзях. Здавалася б, бяскрыўдная праверка праверкі даных можа стаць вузкім месцам пры апрацоўцы вялікіх файлаў або апрацоўцы вялікіх аб'ёмаў уводу карыстальнікам. Самым небяспечным вынікам з'яўляецца ReDoS-атака, калі зламыснік забяспечвае старанна створаны радок, які запускае рэгулярны выраз вэб-праграмы ў найгоршым выпадку, фактычна падвешваючы сервер і робячы яго недаступным для законных карыстальнікаў. Для прадпрыемстваў гэта азначае прастой, страту прыбытку і пашкоджанне рэпутацыі. Пры пабудове складаных сістэм, асабліва тых, якія апрацоўваюць ненадзейныя даныя, усведамленне гэтых падводных камянёў рэгулярных выразаў з'яўляецца найважнейшай часткай бяспекі і аўдыту прадукцыйнасці.

Стварэнне больш разумных сістэм з Mewayz

Такім чынам, як нам выйсці за межы гэтага фундаментальнага абмежавання? Рашэнне прадугледжвае спалучэнне лепшых інструментаў і разумнейшых архітэктурных рашэнняў. Па-першае, распрацоўшчыкі могуць выкарыстоўваць аналізатары рэгулярных выразаў, каб вызначыць праблемныя шаблоны і перапісаць іх, каб яны былі больш эфектыўнымі (напрыклад, з выкарыстаннем квантараў прыналежнасці або атамных груп). Для найвышэйшай прадукцыйнасці існуюць альтэрнатыўныя алгарытмы, якія гарантуюць лінейны час, O(n), для супадзення з шаблонам, хоць яны радзей сустракаюцца ў стандартных бібліятэках.

Стварыце сваю бізнес-АС сёння

Ад фрылансераў да агенцтваў, Mewayz падтрымлівае 138 000+ прадпрыемстваў з 208 інтэграванымі модулямі. Пачніце бясплатна, абнаўляйце па меры росту.

Стварыць бясплатны ўліковы запіс →

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 6,208+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 6,208+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime