ʻO ka ʻimi ʻana i nā pāʻani regex a pau he O(n²) | Mewayz Blog Skip to main content
Hacker News

ʻO ka ʻimi ʻana i nā pāʻani regex a pau he O(n²)

Manaʻo manaʻo

14 min read Via iev.ee

Mewayz Team

Editorial Team

Hacker News

Ke kumu kūʻai huna o ka hoʻohālikelike ʻana i ke kumu hoʻohālike

No nā mea hoʻomohala, ʻo nā ʻōlelo maʻamau (regex) he mea pono loa ia, he pahi Swiss Army no ka hoʻopaʻa ʻana, ka hōʻoia ʻana, a me ka unuhi ʻana i ka ʻike mai ka kikokikona. Mai ka nānā ʻana i nā palapala leka uila i ka ʻohi ʻana i ka ʻikepili mai nā lāʻau, regex ka hopena e hele ai. Eia nō naʻe, aia ma lalo o kēia ʻaoʻao ikaika kahi pahele hana i hoʻopilikia i nā ʻōnaehana no nā makahiki he nui: ʻo ka paʻakikī o ka manawa paʻakikī o ka loaʻa ʻana o nā pāʻani āpau i kahi kaula ʻo O(n²). ʻO kēia paʻakikī o ka manawa quadratic, ʻo ia hoʻi, i ka ulu ʻana o ke kaula hoʻokomo i ka laina, hiki ke ulu nui ka manawa hana, e alakaʻi ana i ka lohi i manaʻo ʻole ʻia, hoʻopau waiwai, a me kahi mea i kapa ʻia ʻo ReDoS(Regular Expression Denial of Service). ʻO ka hoʻomaopopo ʻana i kēia palena ʻokoʻa ka hana mua i ke kūkulu ʻana i nā noi ʻoi aku ka ikaika a me ka maikaʻi.

No ke aha ke hoʻohālikelike nei ʻo Regex iā O(n²)? Ka pilikia o ka hoʻihoʻi ʻana

Aia ke kumu o ka paʻakikī O(n²) i ke ʻano o ka nui o nā ʻenekini regex kuʻuna: backtracking. Ke ho'āʻo nei kahi ʻenekini regex, e like me ka mea ma Perl, Python, a i ʻole Java, e ʻimi i nā pāʻani āpau, ʻaʻole ia e nānā wale i ke kaula i hoʻokahi manawa. Ke ʻimi nei i nā ala like ʻole. E noʻonoʻo i kahi ʻano maʻalahi e like me `(a+)+b` i hoʻopili ʻia i kahi kaula o ka hapa nui o "a", e like me "aaaaaaaac". Hoʻohālikelike ka ʻenekini i nā "a" a pau me ka ʻa+ʻ mua, a laila hoʻāʻo e hoʻohālikelike i ka "b" hope. Ke hāʻule, hoʻihoʻi ia — hoʻohālikelike ʻole i ka "a" hope loa a hoʻāʻo i ka helu `+` ma ka hui waho. Ke hana hou nei kēia kaʻina hana, e koi ana i ka ʻenekini e hoʻāʻo i kēlā me kēia hui pū ʻana o ka hui ʻana o nā "a", e alakaʻi ana i kahi pahū combinatorial o nā mea hiki. Hiki ke kūlike ka heluna o nā ala e ʻimi ai ka ʻenekini i ka huinahā o ka lōʻihi o ke kaula, no laila ʻO(n²).

  • Nā Mea Hoʻohālikelike: Hoʻohana nā ʻano like me `.*` a i ʻole .+` i ka nui o nā kikokikona i ka wā mua, e alakaʻi ana i ka hoʻihoʻi nui ʻana inā ʻaʻole kūlike nā ʻāpana o ke kumu.
  • Nā helu helu ʻana: ʻO nā ʻōlelo e like me `(a+)+` a i ʻole `(a*a*)*` e hana i ka helu exponential o nā ala e hoʻokaʻawale ai i ke kaula hoʻokomo, e hoʻonui nui i ka manawa hana.
  • Nā Mauna Kūkākūkā: Inā hiki ke hoʻohālikelike ʻia ke kaula i nā ʻano like ʻole, pono e nānā ka ʻenekini i kēlā me kēia hiki ke loaʻa nā pāʻani āpau.

Ka hopena o ka honua maoli: ʻoi aku ma mua o ka hoʻolohi wale ʻana

ʻAʻole kēia he manaʻo hoʻonaʻauao wale nō. Hiki i ka regex kūpono ʻole ke loaʻa i nā hopena koʻikoʻi i nā kaiapuni hana. Hiki ke lilo i ka hōʻoia hōʻoia ʻikepili ʻino ʻole i ka bottleneck i ka wā e hoʻoponopono ai i nā faila nui a i ʻole ka lawelawe ʻana i nā leo kiʻekiʻe o ka mea hoʻohana. ʻO ka hopena pōʻino loa he ReDoS hoʻouka, kahi e hāʻawi ai kahi mea hana ʻino i kahi kaula i hana ʻia e hoʻoulu ai i ka hana ʻino loa i ka regex o kahi polokalamu pūnaewele, e kau pono ana i ke kikowaena a hiki ʻole i nā mea hoʻohana pono. No nā ʻoihana, unuhi pololei kēia i ka downtime, nalowale ka loaʻa kālā, a me ka maikaʻi ʻino. I ke kūkulu ʻana i nā ʻōnaehana paʻakikī, ʻoi aku ka poʻe e hana ana i ka ʻikepili hilinaʻi ʻole, ʻo ka ʻike ʻana i kēia mau pilikia regex he ʻāpana koʻikoʻi o ka palekana a me ka loiloi hana.

"Ua loaʻa iā mākou kahi hōʻano hou hoʻonohonoho liʻiliʻi i hoʻokomo i kahi regex e hoʻopau i nā kaula hoʻohana-agent. Ma lalo o ka ukana maʻamau, ua maikaʻi. - He Luna Nui DevOps

Kūkulu ʻana i nā ʻōnaehana akamai me Mewayz

No laila, pehea mākou e neʻe ai ma mua o kēia kaohi kumu? Hoʻopili ka hoʻonā i ka hui pū ʻana o nā mea hana ʻoi aku ka maikaʻi a me nā koho hoʻolālā akamai. ʻO ka mea mua, hiki i nā mea hoʻomohala ke hoʻohana i nā loiloi regex e ʻike i nā ʻano pilikia a kākau hou iā lākou i ʻoi aku ka maikaʻi (e like me ka hoʻohana ʻana i nā quantifiers possessive a i ʻole nā ​​hui atomic). No ka hana hope loa, aia nā algorithms ʻē aʻe e hōʻoiaʻiʻo ana i ka manawa laina, O(n), no ka hoʻohālikelike ʻana i ke ʻano, ʻoiai ʻaʻole maʻamau ia mau mea ma nā hale waihona puke.

ʻO kēia kahi e hāʻawi ai kahi OS pāʻoihana modular e like me Mewayz i kahi pōmaikaʻi nui. ʻAe ʻo Mewayz iā ʻoe e hoʻokaʻawale a nānā i nā kaʻina hana koʻikoʻi. Ma mua o ka loaʻa ʻana o kahi noi monolithic kahi e hiki ai i kahi regex lohi hoʻokahi ke hoʻopōʻino i ka ʻōnaehana holoʻokoʻa, hiki iā ʻoe ke kau i kahi microservice i hoʻolaʻa ʻia no ka parsing data a me ka hōʻoia. Inā kū mai kahi pilikia hana, aia ia a hiki ke hoʻoponopono ʻia me ka hoʻopilikia ʻole i nā hana ʻoihana ʻē aʻe. Eia kekahi, hiki i nā mea hana nānā i loko o ka platform Mewayz ke kōkua iā ʻoe e kuhikuhi i kēia mau hemahema ma mua o ka hopena o kāu mea kūʻai aku, e hoʻohuli i kahi pilikia i kahi hana hoʻokele hiki ke hoʻokele. Ma ke kūkulu ʻana ma luna o kahi kahua maʻalahi a nānā ʻia, e hōʻoia ʻoe i ka hoʻokō ʻana a me ke kūpaʻa o kāu ʻoihana ʻoihana, me ka hoʻoili kikokikona paʻakikī.

💡 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 →

Nīnau pinepine

Ke kumu kūʻai huna o ka hoʻohālikelike ʻana i ke kumu hoʻohālike

No nā mea hoʻomohala, ʻo nā ʻōlelo maʻamau (regex) he mea pono loa ia, he pahi Swiss Army no ka hoʻopaʻa ʻana, ka hōʻoia ʻana, a me ka unuhi ʻana i ka ʻike mai ka kikokikona. Mai ka nānā ʻana i nā palapala leka uila i ka ʻohi ʻana i ka ʻikepili mai nā lāʻau, regex ka hopena e hele ai. Eia nō naʻe, aia ma lalo o kēia ʻaoʻao ikaika kahi pahele hana i hoʻopilikia i nā ʻōnaehana no nā makahiki he nui: ʻo ka paʻakikī o ka manawa paʻakikī o ka loaʻa ʻana o nā pāʻani āpau i kahi kaula ʻo O(n²). ʻO kēia paʻakikī o ka manawa quadratic, ʻo ia hoʻi, i ka ulu ʻana o ke kaula hoʻokomo i ka laina, hiki ke ulu nui ka manawa hana, e alakaʻi ana i ka lohi i manaʻo ʻole ʻia, pau ka waiwai, a me kahi mea i kapa ʻia ʻo ReDoS (Regular Expression Denial of Service). ʻO ka hoʻomaopopo ʻana i kēia palena ʻokoʻa ka hana mua i ke kūkulu ʻana i nā noi ʻoi aku ka ikaika a me ka maikaʻi.

No ke aha i hoʻohālikelike ai ʻo Regex iā O(n²)? Ka pilikia o ka hoʻihoʻi ʻana

Aia ke kumu o ka paʻakikī O(n²) i ke ʻano o ka nui o nā ʻenekini regex kuʻuna: backtracking. Ke ho'āʻo nei kahi ʻenekini regex, e like me ka mea ma Perl, Python, a i ʻole Java, e ʻimi i nā pāʻani āpau, ʻaʻole ia e nānā wale i ke kaula i hoʻokahi manawa. Ke ʻimi nei i nā ala like ʻole. E noʻonoʻo i kahi ʻano maʻalahi e like me `(a+)+b` i hoʻopili ʻia i kahi kaula o ka hapa nui o "a", e like me "aaaaaaaac". Hoʻohālikelike ka ʻenekini i nā "a" a pau me ka ʻa+ʻ mua, a laila hoʻāʻo e hoʻohālikelike i ka "b" hope. Ke hāʻule, hoʻihoʻi ia — hoʻohālikelike ʻole i ka "a" hope loa a hoʻāʻo i ka helu `+` ma ka hui waho. Ke hana hou nei kēia kaʻina hana, e koi ana i ka ʻenekini e hoʻāʻo i kēlā me kēia hui pū ʻana o ka hui ʻana o nā "a", e alakaʻi ana i kahi pahū combinatorial o nā mea hiki. Hiki ke kūlike ka heluna o nā ala e ʻimi ai ka ʻenekini i ka huinahā o ka lōʻihi o ke kaula, no laila ʻO(n²).

Ka hopena o ka honua maoli: ʻoi aku ma mua o ka hoʻolohi wale ʻana

ʻAʻole kēia he manaʻo hoʻonaʻauao wale nō. Hiki i ka regex kūpono ʻole ke loaʻa i nā hopena koʻikoʻi i nā kaiapuni hana. Hiki ke lilo i ka hōʻoia hōʻoia ʻikepili ʻino ʻole i ka bottleneck i ka wā e hoʻoponopono ai i nā faila nui a i ʻole ka lawelawe ʻana i nā leo kiʻekiʻe o ka mea hoʻohana. ʻO ka hopena pōʻino loa he ReDoS hoʻouka, kahi e hāʻawi ai kahi mea hana ʻino i kahi kaula i hana ʻia e hoʻoulu ai i ka hana ʻino loa i ka regex o kahi polokalamu pūnaewele, e kau pono ana i ke kikowaena a hiki ʻole i nā mea hoʻohana pono. No nā ʻoihana, unuhi pololei kēia i ka downtime, nalowale ka loaʻa kālā, a me ka maikaʻi ʻino. I ke kūkulu ʻana i nā ʻōnaehana paʻakikī, ʻoi aku ka poʻe e hana ana i ka ʻikepili hilinaʻi ʻole, ʻo ka ʻike ʻana i kēia mau pilikia regex he ʻāpana koʻikoʻi o ka palekana a me ka loiloi hana.

Kūkulu ʻana i nā ʻōnaehana akamai me Mewayz

No laila, pehea mākou e neʻe ai ma mua o kēia kaohi kumu? Hoʻopili ka hoʻonā i ka hui pū ʻana o nā mea hana ʻoi aku ka maikaʻi a me nā koho hoʻolālā akamai. ʻO ka mea mua, hiki i nā mea hoʻomohala ke hoʻohana i nā loiloi regex e ʻike i nā ʻano pilikia a kākau hou iā lākou i ʻoi aku ka maikaʻi (e like me ka hoʻohana ʻana i nā quantifiers possessive a i ʻole nā ​​hui atomic). No ka hana hope loa, aia nā algorithms ʻē aʻe e hōʻoiaʻiʻo ana i ka manawa laina, O(n), no ka hoʻohālikelike ʻana i ke ʻano, ʻoiai ʻaʻole maʻamau ia mau mea ma nā hale waihona puke.

Kūkulu i kāu OS ʻoihana i kēia lā

Mai nā mea kūʻokoʻa a hiki i nā keʻena, hoʻohana ʻo Mewayz i nā ʻoihana 138,000+ me 208 mau modula i hoʻohui ʻia. Hoʻomaka manuahi, hoʻomaikaʻi i kou wā e ulu ai.

Hana moʻokāki manuahi →