Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Go

Mga Regular na Eskpresyon sa Go: Unang Bahagi

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Regular Expressions With Go.
Regular Expressions With Go: Part 2

Tagalog (Wikang Tagalog) translation by Anna Nelson (you can also view the original English article)

Pangkalahatang Ideya

Ang regular expressions (AKA regex) ay isang pormal na lenggwahe na binibigyang-depenisyon ang hanay ng mga karakter na may pagkakaayos. Sa totoong buhay ay maaari itong gamitin upang solusyonan ang mga problemang may tekstong di-buo ang estruktura. Maaaring kunin ang mga mahahalagang bahagi mula sa teksto na mayroong maraming dekorasyon at lamang walang ugnayan. Ang Go ay mayroong malakas na regex na pakete sa koleksyon nito na maaarin himayin ang teksto gamit ang mga regex.

Sa serye na itong mayroong dalawang bahagi, malalaman kung ano ang mga regular expression at kung paano gamitin ang mga ito sa Go upang makagawa ng simpleng gawain. Kung hindi pamilyar sa mga regular expression, maraming magagandang tutoryal. Heto ang isa.

Pag-intindi sa mga Regular Expression

Magsimula sa mabilis na halimbawa. Mayroon kang teksto at nais tignan kung mayroon itong email address. Ang email address ay nakaespesipiko sa RFC 822. Sa madaling sabi, ito ang may local part na sinundan ng @ na simbolo na sinundan ng domain. Ang email address ay mahihiwalay sa ibang teksto gamit gamit ang espasyo.

Upang malaman kung mayroon itong email address ang sumusunod na regex ay gagawin ang: ^\w+@\w+\.\w+$. Pansinin na ang regex na ito ay mapagpahintulot at papayagan ang ilang mga hindi-balidong email address. Ngunit mabuti nang maipakita ang konsepto. Subukan natin sa ibang mga potensyal na email address bago ipaliwanag kung paano gumagana:

Ang regular expression ay gumagana sa halimbawa. Ang unang dalawang address ay hindi tinanggap dahil ang domain ay walang tuldok o walang karakter matapos ng tuldok. Ang ikatlong email ay tama ang ayos. Ang huli ay mayroong dalawang @ na simbolo.

Suriin natin ang regex: ^\w+@\w+\.\w+$

Karakter/simbolo Ibig-sabihin
^ Simula ng target na teksto
\w Kahit anong karakter ng mga salita [0-9A-Za-z_]
+ Kahit isa sa mga nagdaang karakter
@ Ang @ na karakter
\. Ang tuldok na karakter. Kailangan ay nakatakas kasama \
$ Wakas ng target na teksto

Sama-sama, ang regex ay tutugma sa piraso ng teksto na nagsisimula sa isa o higit pa na karakter ng salita, susundan ng “@” na karakter, susundan mula ng isa o higit pa na karakter ng salita, susundan ng tuldok, at susundan muli ng isa o higit pang karakter ng salita.

Pakikitungo sa mga Espesyal na Karakter

Ang mga sumusunod na karakter ay may espesyal na ibig-sabihin sa mga regular expression: .+*?()|[]{}^$\. Marami na tayong nakita sa email na halimbawa. Kung nais tugmain, kailangan mag-escape gamit ng backlash. Tayo’y magpakilala ng maliit na helper function na tinatawag na match() na makakatipid sa pag-type. Kailangan ng pattern at ilang teksto, gamit ang regexp.Math() paraan ng upang magtugma ang pattern sa teksto (mataposgawin byte array ang teksto), at i-print ang resulta:

Heto ang halimbawa ng pagtugma ng regular na karakter gaya ng z kontra sa pagtugma ng espesyal na karakter gaya ng ?:

Ang regex pattern na \? ay mayroong backslash na kailangang i-escape gamit ng isa pang backslash kapag rinepresenta bilang regular na Go string. Ang rason ay ginagamit din ang backslash upang mag-escape ng mga espesyal na karakter sa Go strings gaya ng newline (\n). Kung nais tugmaan ang mismong backslash na karakter, kailangang ng apat na slash!

Ang solusyon ay gumamit ng Go raw strings kasama ng backtick (`) imbis na double quotes. Kung nais tugman ang newline na karakter, kailangang bumalik sa regular na strings at harapin ang maraming backslash escape.

Mga Placeholder at Repetisyon

Sa karamihan ng mga kaso, hindi kailangang pagtugmain ang serye ng espesipikong mga karakter gaya ng “abc,” kundi isang serye na may hindi-alam na haba na mayroong naka-singit na ilang kilalang karakter. Sinusuportahan ito ng regex kasama ang tuldok . espesyal na karakter na may katumbas na kahit anong karakter. Ang * na espesyal na karakter ay inuulit ang nakaraang karakter (o grupo) wala o higit pang beses. Kapag pinagsama, gaya ng .*, nagtutugma ng kahit ano dahil ibig-sabihin ay mayroong wala o higit pang karakter. Ang + ay hawig sa *, ngunit tumutugma sa isa o higit pa sa nagdaang karakter o grupo. Kaya ang .+ ay tutugma sa kahit anong tekstong may laman.

Panggamit ng mga Boundary

Mayroong tatlong klase ng boundary: ang simula ng teksto na minamarkahan ng ^, ang dulo ng teksto na minamarkahan ng $, at ang boundary ng salita na minamarkahan ng \b. Halimbawa, tignan ang teksto mula sa klasikong pelikula ng The Princess Bride: “Ang pangalan ko ay Inigo Montoya. Pinatay mo ang aking ama. Humanda kang mamatay.” Kung pinagtugma ang “tatay,” makakakuha ng pares, ngunit kung naghahanap ng “tatay” sa dulo ng teksto, kailangan magdagdag ng $ na karakter, at hindi magkakaroon ng pares. Sa kabilang banda, ang pagtugmo ng “Hello” sa umpisa ay gumagana nang maayos.

Ang mga boundary na salita ay tinitignan ang bawat salita. Maaaring magsimula at/o magtapos ng pattern gamit ang \b. Itala na ang mga bantas gaya ng kuwit ay kinokonsidera na boundary at hindi parte ng salita. Heto ang ilang halimbawa:

Paggamit ng mga Class

Ito ay madalas na magagamit sa pagsama-sama ng grupo ng mga karakter gaya na lahat ng digit, whitespace na karakter, o lahat ng alphanumeric na karakter. Sinusuportahan ng Golang ang POSIX na mga class, na ang:

Class ng Karakter Ibig-sabihin
[:alnum:]
alphanumeric (≡ [0-9A-Za-z])
[:alpha:]
alphabetic (≡ [A-Za-z])
[:ascii:]
ASCII (≡ [\x00-\x7F])
[:blank:]
blank (≡ [\t ])
[:cntrl:]
control (≡ [\x00-\x1F\x7F])
[:digit:]
digits (≡ [0-9])
[:graph:]
graphical (≡ [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])
[:lower:]
lower case (≡ [a-z])
[:print:]
maaaritng i-print (≡ [ -~] == [ [:graph:]])
[:punct:]
pagbabantas (≡ [!-/:-@[-`{-~])
[:space:]
whitespace (≡ [\t\n\v\f\r ])
[:upper:]
upper case (≡ [A-Z])
[:word:]
Karakter ng salita (≡ [0-9A-Za-z_])
[:xdigit:]
hex digit (≡ [0-9A-Fa-f])

Sa sumusunod na halimbawa, gagamitin ang [:digit:] na class upang maghanap ng mga number sa teksto. Ipapakita rin paano maghanap ng eksaktong numero ng karakter sa pagdagdag ng hinihinging numero sa curly braces.

Maaaari ring magbigay-depinisyon sa sariling mga class sa pamamagitan ng paglagay ng mga karakter sa loob ng square brackets. Halimbawa, kung nais tignan kung ang teksto ay balido na DNA sequence na mayroon lamang na mga karakter na ACGT, gagamitin ang ^[ACGT]*$ regex:

Paggamit ng mga Alternatibo

Sa ilang mga kaso, maraming maaaring gamiting alternatibo. Ang pagtugma ng mga HTTP URL ay may sinusundang protokol, na maaaring http:// o https://. Ang pipe na karakter | ang nagpapapili sa pagitan ng dalawang alternatibo. Heto ang isang regex na mag-aayos sa mga ito (http)|(https)://\w+\.\w{2,}. Ito ay magiging string na magsisimula sa http:// o https:// na susundan ng kahit isang karakter na salita na susundan ng tuldok na susundan ng kahit dalawang karakter na salita.

Konklusyon

Sa parteng ito ng tutoryal, maraming nasakop at natutunan tungkol sa mga regular expression, na may mga halimbawa gamit ang Golang regexp library. Nagpokus sa purong pagtugma at kung paano ipakita ang intensyon gamt ang regular expression.

Sa ikalawang parte, magpopokus sa paggamit ng regular expression upang magtrabaho gamit ng teksto, kabilang na ang fuzzy finding, mga replacement, grouping, at pagharap ng mga new line.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.