regulære udtryk (forkortet til regeks) bruges til at fungere på mønstre, der findes i strenge. De kan finde, erstatte eller fjerne visse dele af strenge afhængigt af hvad du beder dem om at gøre. I Ruby er de altid indeholdt i to fremadrettede skråstreger.
for eksempel ved hjælp af .gsub metode til strenge:
sentence = "This is a sample sentence."
sentence.gsub(/a/, "") #returns "This is smple sentence."
den .gsub-metoden er at finde alle a ‘ erne i strengen og fjerne dem, fordi anden halvdel af argumentet er tomt. Hvis vi skulle tilføje noget mellem citaterne:
sentence.gsub(/This/, "*") #returns "* is a sample sentence."
den finder og erstatter derefter alle forekomster af “dette” med en stjerne (*). Der er også en måde at vende denne funktionalitet på, at tilføje en caret (^) foran på det regulære udtryk vil gøre det modsatte:
sentence.gsub(//, "*") #returns "********a**a**************"
alt (herunder rum!) i strengen, der ikke er en a, erstattes med stjerner. Bemærk, at for at anvende denne funktionalitet er de firkantede parenteser () nødvendige, uden dem vil gsub ikke gøre noget.
det er muligt at sende tal eller bogstavområder ind i regekset for at redde dig selv fra at skulle skrive hvert bogstav i alfabetet eller alle tal 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 bogstavintervaller:
sentence.gsub(//, "🔥")
#returns "🔥🔥1🔥 1🔥 🔥 🔥🔥🔥🔥🔥3 🔥3🔥🔥3🔥🔥3."
A-Å indeholder alle store bogstaver og a-Å indeholder alle små bogstaver. Så denne gsub fjerner alle bogstaver og erstatter dem med brandemoji.
genveje
der er mange nyttige genveje til rådighed for at forenkle, hvad der bliver overført til regekset. Her er nogle af de mest nyttige, jeg har fundet indtil videre:
- \målretning mod alle bogstaver og tal:
lorem = "Lorem ipsum."
lorem.gsub(//, "wow") #returns "wowwowwowwowwow wowwowwowwowwow."
• \for at gøre det modsatte (i nedenstående eksempel erstatter det mellemrummene og perioden i slutningen med “”):
lorem.gsub(//, "wow") #returns "Loremwowipsumwow"
- \d til målretning af alle heltal:
lorem = "L0r3m 1psum"
lorem.gsub(//, "-") #returns "L-r-m -psum."
- \D for at gøre det modsatte
lorem.gsub(//, "-") #returns "-0-3--1-----"
der er mange flere genveje, og en stor ressource til dette, Jeg fandt, er Rubular, den har en liste over dem og lader dig teste dem ud i Bro.sereren.
blokke
blokke kan bruges til at ændre hvordan .gsub opfører sig. Her er et eksempel på kapitalisering af hvert ord i en streng:
cool_phrase = "slow lorises are cool"
cool_phrase.gsub(/\w+/) {|word| word.capitalize}
#returns "Slow Lorises Are Cool"
Bemærk: symbolet ” + ” efter \ V er at vælge hvert ord, der har 1 eller flere tegn. Uden ” + ” ville hele strengen være store bogstaver.
her er et andet eksempel, hvor tallet i en streng øges:
year = "The year is 3100"
year.gsub(/\d+/) {|num| num.to_i + 1} #returns "The year is 3101"
bemærk: igen vælger symbolet ” + ” hvert nummer, der har 1 eller flere tal som helhed. Uden det ville afkastet være” året er 4211″, fordi det ville øge hvert nummer individuelt.
Use Cases
regulære udtryk bruges ofte til at validere eller filtrere brugerinput. Forestil dig din hjemmeside har en formular, der tager i en brugers telefonnummer. Her er et eksempel på at fjerne symbolerne for kun at få nummeret som et heltal:
phone_number = "(123)456-7890"
phone_number.gsub(/, ""/) #returns "1234567890"
når du får brugerens navn, er det nyttigt at kun få en række bogstaver og fjerne alt, hvad de indtaster, der er et tal eller et symbol.
steve = "St97eve Brul()*)e "
steve.gsub(//, "").split(/(?=)/).join(" ")
#returns "Steve Brule"
ovenstående eksempel ser lidt komplekst ud, men alt det gør er at fjerne alle symboler og tal, opdele resultatet i et array baseret på hvor store bogstaver er, og sammenføje dem i en streng.
konklusion og ressourcer
regulære udtryk og .gsub er kraftfulde værktøjer, der kan forbedre dit program, men at læse og forsøge at finde ud af dem kan nogle gange føles som om du læser hieroglyffer (se billedet nedenfor). Jeg anbefaler at tage din tid på at lære dem og forsøge at finde ud af dem en ad gangen. Gør dette, og snart vil du være en regeks mester!