Regulære uttrykk (forkortet til regex) brukes til å operere på mønstre som finnes i strenger. De kan finne, erstatte eller fjerne visse deler av strenger avhengig av hva du forteller dem å gjøre. I Ruby er de alltid inneholdt i to fremre skråstreker.
for eksempel bruker du .gsub metode for strenger:
sentence = "This is a sample sentence."
sentence.gsub(/a/, "") #returns "This is smple sentence."
Den .gsub-metoden finner alle a-ene i strengen og fjerner dem, fordi den andre halvdelen av argumentet er tomt. Hvis vi skulle legge til noe mellom sitatene:
sentence.gsub(/This/, "*") #returns "* is a sample sentence."
den finner og erstatter alle forekomster av «Dette» med en stjerne (*). Det er også en måte å reversere denne funksjonaliteten på, og legge til en caret ( ^ ) på forsiden av det vanlige uttrykket vil gjøre det motsatte:
sentence.gsub(//, "*") #returns "********a**a**************"
Alt (inkludert mellomrom!) i strengen som IKKE er en a blir erstattet med stjerner. Legg merke til at for å kunne bruke denne funksjonaliteten er firkantede parenteser () nødvendige, uten dem vil gsub ikke gjøre noe.
det er mulig å passere tall eller brev områder i regex å spare deg selv fra å måtte skrive ut hver bokstav i alfabetet eller alle tallene 0 til 9.
sentence = "Th1s 1s a sampl3 s3nt3nc3."
sentence.gsub(//, "!") #these return the same thing
sentence.gsub(//, "!") # "Th!s !s a sampl! s!nt!nc!."
og for bokstavområder:
sentence.gsub(//, "🔥")
#returns "🔥🔥1🔥 1🔥 🔥 🔥🔥🔥🔥🔥3 🔥3🔥🔥3🔥🔥3."
A-Z inneholder alle store bokstaver og a-z inneholder alle små bokstaver. Så denne gsub fjerner alle bokstaver og erstatter dem med brann emoji.
Snarveier
det er mange nyttige snarveier tilgjengelig for å forenkle det som blir sendt inn i regex. Her er noen av de mest nyttige jeg har funnet så langt:
- \w for målretting mot alle bokstaver og tall:
lorem = "Lorem ipsum."
lorem.gsub(//, "wow") #returns "wowwowwowwowwow wowwowwowwowwow."
• \W å gjøre det motsatte (i eksemplet nedenfor erstatter det mellomrom og perioden på slutten med «wow»):
lorem.gsub(//, "wow") #returns "Loremwowipsumwow"
- \d for målretting av alle heltall:
lorem = "L0r3m 1psum"
lorem.gsub(//, "-") #returns "L-r-m -psum."
- \D for å gjøre det motsatte
lorem.gsub(//, "-") #returns "-0-3--1-----"
Det er mange flere snarveier og en stor ressurs for Dette jeg fant Er Rubular, den har en liste over dem og lar deg teste dem ut i nettleseren.
Blokker
Blokker kan brukes til å endre hvordan .gsub oppfører seg. Her er et eksempel for å utnytte hvert ord i en streng:
cool_phrase = "slow lorises are cool"
cool_phrase.gsub(/\w+/) {|word| word.capitalize}
#returns "Slow Lorises Are Cool"
Merk: «+ » – symbolet etter \w velger hvert ord som har 1 eller flere tegn. Uten » + » ville hele strengen være stor.
her er et annet eksempel der tallet i en streng økes:
year = "The year is 3100"
year.gsub(/\d+/) {|num| num.to_i + 1} #returns "The year is 3101"
Merk: igjen velger » + » – symbolet hvert tall som har 1 eller flere tall som helhet. Uten det ville avkastningen være «året er 4211» fordi det ville øke hvert nummer individuelt.
Brukstilfeller
Regulære uttrykk brukes ofte til å validere eller filtrere brukerinndata. Tenk deg at nettstedet ditt har et skjema som tar inn brukerens telefonnummer. Her er et eksempel på å fjerne symbolene for å bare få nummeret som et heltall:
phone_number = "(123)456-7890"
phone_number.gsub(/, ""/) #returns "1234567890"
Når du får brukerens navn, er det nyttig å bare få en streng med bokstaver og fjerne alt de legger inn som er et tall eller et symbol.
steve = "St97eve Brul()*)e "
steve.gsub(//, "").split(/(?=)/).join(" ")
#returns "Steve Brule"
eksemplet ovenfor ser litt komplekst ut, men alt det gjør er å fjerne alle symboler og tall, dele resultatet i en matrise basert på hvor store bokstaver er, og bli med dem i en streng.
Konklusjon Og Ressurser
Regulære uttrykk og .gsub er kraftige verktøy som kan forbedre programmet ditt, men å lese og prøve å finne ut av dem kan noen ganger føle at du leser hieroglyfer (se bildet nedenfor). Jeg anbefaler å ta deg tid til å lære dem og prøve å finne dem ut en om gangen. Gjør dette og snart vil du bli en regex master!