Kipimo cha Regex: jenga na tatua ruwaza dhidi ya maandishi yako mwenyewe
Usemi wa kawaida (regular expression) ni lugha ndogo ya kuelezea umbo la maandishi. Badala ya kuuliza "je, neno hili hasa liko hapa?", regex hukuruhusu kuuliza "je, kuna mfuatano unaoonekana kama hivi?" Hilo ndilo linalofanya iwe na nguvu kwa kutafuta, kuthibitisha, kutoa, na kubadilisha maandishi katika vihariri vya msimbo, mafaili ya logi, maingizo ya fomu, na hati za amri. Pia ndilo linalofanya iwe rahisi kukosea, kwa sababu ruwaza inayosomeka vizuri akilini mwako inaweza kimyakimya kulinganisha zaidi, kidogo zaidi, au chochote kabisa.
Hii ndiyo sababu kupima kwa mwingiliano hushinda kubahatisha. Unapoandika ruwaza na kuangalia mifanano ikiangaza kwenye maandishi halisi ya mfano, unapata mrejesho wa papo hapo: unaona kilichokamatwa, kilichopita, na kikundi kipi cha ukamataji kilichokamata kipande kipi. Kipimo chetu cha Regex hufanya kazi kabisa ndani ya kivinjari chako. Ruwaza yako na maandishi yako ya mfano hayawahi kutoka kwenye ukurasa, hivyo unaweza kubandika mistari ya logi, barua pepe, au data ya uzalishaji bila kutuma chochote kwenye seva.

Vipande vya msingi vinavyofaa kujua
Ruwaza nyingi za kila siku hujengwa kutoka seti ndogo ya vipande. Jifunze hivi na utaweza kusoma sehemu kubwa ya regex unazokutana nazo popote.
Madarasa ya herufi huelezea seti ya herufi zinazoruhusiwa. [aeiou] hulingana na irabu yoyote moja, [0-9] hulingana na tarakimu moja, na [a-zA-Z] hulingana na herufi moja. Alama ya caret ndani ya mabano hukanusha seti, hivyo [^0-9] humaanisha "herufi yoyote isiyo tarakimu." Vifupisho huokoa uandishi: \d ni tarakimu, \w ni herufi ya neno (herufi, tarakimu, mstari wa chini), \s ni nafasi tupu, na alama ya nukta . hulingana na karibu herufi yoyote moja.
Vipimo idadi (quantifiers) huelezea kipande cha awali kinaweza kurudiwa mara ngapi. * humaanisha sifuri au zaidi, + humaanisha moja au zaidi, na ? humaanisha sifuri au moja (hiari). Kwa idadi hasa, {3} humaanisha hasa tatu na {2,4} humaanisha mbili hadi nne. Hivyo \d{4} hulingana na mwaka wa tarakimu nne na colou?r hulingana na maandishi yote mawili.
Nanga (anchors) hufunga ruwaza kwenye nafasi badala ya herufi. ^ hulingana na mwanzo wa maandishi, $ hulingana na mwisho, na \b huashiria mpaka wa neno. Ruwaza ^Error hulingana tu na mistari inayoanza na "Error", ndilo hasa unalotaka wakati wa kuchunguza logi.
Vikundi hufunga sehemu ya ruwaza katika mabano, vyote viwili kutumia kipimo idadi kwa herufi kadhaa kwa mara moja na kukamata maandishi yaliyolingana kwa matumizi tena. Katika (\d{4})-(\d{2})-(\d{2}) kila kikundi hukamata kipengele cha tarehe unachoweza kukitoa baadaye. Ubadilishaji (alternation) na mstari wa wima hufanya kazi kama "au": cat|dog|fish hulingana na neno lolote kati ya matatu.
Ruwaza utakazozitumia kwa kweli
Kazi chache zinazorudia hushughulikia kazi nyingi halisi. Kukamata kitu kinachofanana na barua pepe, [\w.+-]+@[\w-]+\.[\w.-]+ ni mwanzo wa vitendo; uthibitishaji kamili wa barua pepe kulingana na kiwango rasmi ni maarufu kwa ugumu wake, na ruwaza huru kwa kawaida ndiyo chaguo sahihi kwa kuangazia washindani badala ya kukataa watumiaji.
Kwa namba, \d+ hukamata mfululizo wa tarakimu, wakati -?\d+(\.\d+)? hulingana na hasi na desimali za hiari. Kuondoa nafasi tupu za mwanzoni na mwishoni, lingana na ^\s+|\s+$ na ubadilishe na tupu. Kupata maneno yaliyorudiwa, ruwaza ya backreference \b(\w+)\s+\1\b hulingana na neno likifuatiwa na lenyewe, ambapo \1 hurejea kwenye kikundi cha kwanza kilichokamatwa.

Alama huathiri jinsi ulinganishi unavyofanya kazi
Alama ni vibadilisho vinavyorekebisha ruwaza nzima. Alama ya global (g) hupata mifanano yote badala ya kusimama kwenye ya kwanza, ndilo unalotaka wakati wa kuangazia matukio yote. Alama ya case-insensitive (i) hufanya error ilingane na "Error" na "ERROR" sawasawa. Alama ya multiline (m) hubadilisha ^ na $ ili zilingane na mwanzo na mwisho wa kila mstari, si maandishi yote tu, jambo la muhimu kwa kazi ya logi mstari kwa mstari. Alama nyingine muhimu ni pamoja na s (dotall, ikiruhusu nukta kulingana na mistari mipya) na u kwa ushughulikiaji kamili wa Unicode.
Aina hutofautiana kidogo kulingana na lugha
Regex ni familia ya lahaja, si kiwango kimoja kilichowekwa. JavaScript, Python, PCRE (PHP), Java, .NET, Go, na Rust hukubaliana kuhusu muundo wa msingi ulio hapo juu, lakini hutofautiana kwenye kingo: uungwaji mkono wa lookbehind, muundo wa jina la kikundi ((?<name>...) dhidi ya (?P<name>...)), matoroko ya sifa za Unicode, na alama zipi zipo hutofautiana. Ruwaza inayofanya kazi katika injini moja huenda ikahitaji marekebisho madogo katika nyingine, hivyo inafaa kupima dhidi ya aina unayotumia hasa. Ukisha kuwa na ruwaza iliyokamilika, vifaa vyetu vingine vya wasanidi programu na vifaa vya maandishi vinaweza kusaidia na kazi inayozunguka ya kusafisha, kusimba, na kubadilisha data uliyoiiga.
Maswali yanayoulizwa mara kwa mara
Je, maandishi yangu hutumwa kwa seva?
Hapana. Kipimo cha Regex hufanya kazi kabisa ndani ya kivinjari chako. Ruwaza yako na maandishi ya mfano hubaki kwenye kifaa chako na haiwahi kupakiwa, hivyo ni salama kubandika data nyeti.
Chombo hiki hutumia aina gani ya regex?
Hutumia injini ya regex ya JavaScript iliyojengwa ndani ya kivinjari chako. Muundo wa msingi unalingana na unaoujua kutoka lugha nyingi, ingawa baadhi ya sifa za hali ya juu hutofautiana kidogo na PCRE, Python, au .NET.
Tofauti kati ya ulinganishi wa "greedy" na "lazy" ni ipi?
Kwa kawaida vipimo idadi ni "greedy" (vyenye pupa) na hukamata maandishi mengi iwezekanavyo. Kuongeza alama ya swali huvifanya "lazy" (vivivu), hivyo hukamata kidogo iwezekanavyo. Kwa mfano, ruwaza ya nukta-nyota ni greedy wakati nukta-nyota-alama-ya-swali ni lazy.
Ninawezaje kulingana na herufi maalum halisi?
Iepushe kwa mstari wa nyuma. Kulingana na nukta halisi, andika mstari wa nyuma kisha nukta. Kanuni ile ile inatumika kwa herufi nyingine maalum kama mabano, mabano ya mraba, alama ya kuongeza, na alama ya swali.
Kwa nini ruwaza yangu haifanani na chochote?
Sababu za kawaida ni alama ya global iliyokosekana, nanga zilizofunga mfanano kwenye nafasi mbaya, herufi maalum isiyoepushwa, au vipimo idadi vyenye pupa vinavyozidi mpaka uliotarajia. Pima kipande kwa kipande kupata chanzo.
Je, ninaweza kukamata sehemu za mfanano?
Ndiyo. Funga sehemu ya ruwaza kwenye mabano kuunda kikundi cha ukamataji. Kila kikundi huripotiwa peke yake, jambo linalokuruhusu kutoa sehemu kama mwaka, mwezi, na siku kutoka tarehe.
