reguljära uttryck (förkortat till regex) används för att fungera på mönster som finns i strängar. De kan hitta, ersätta eller ta bort vissa delar av strängar beroende på vad du säger till dem att göra. I Ruby finns de alltid inom två snedstreck framåt.
till exempel, med användning av .gsub-metod för strängar:
sentence = "This is a sample sentence."
sentence.gsub(/a/, "") #returns "This is smple sentence."
den .gsub-metoden är att hitta alla a i strängen och ta bort dem, eftersom den andra halvan av argumentet är tomt. Om vi skulle lägga till något mellan citaten:
sentence.gsub(/This/, "*") #returns "* is a sample sentence."
den hittar och ersätter sedan alla instanser av ”detta” med en asterisk (*). Det finns ett sätt att vända den här funktionen också, att lägga till en caret ( ^ ) på framsidan av det reguljära uttrycket kommer att göra motsatsen:
sentence.gsub(//, "*") #returns "********a**a**************"
allt (inklusive utrymmen!) i strängen som inte är en a ersätts med asterisker. Lägg märke till att för att tillämpa denna funktionalitet är kvadratkonsoler () nödvändiga, utan dem kommer gsub inte att göra någonting.
det är möjligt att skicka nummer eller bokstavsintervall i regex för att rädda dig från att behöva skriva ut varje bokstav i alfabetet eller alla siffror 0 till 9.
sentence = "Th1s 1s a sampl3 s3nt3nc3."
sentence.gsub(//, "!") #these return the same thing
sentence.gsub(//, "!") # "Th!s !s a sampl! s!nt!nc!."
och för bokstavsintervall:
sentence.gsub(//, "🔥")
#returns "🔥🔥1🔥 1🔥 🔥 🔥🔥🔥🔥🔥3 🔥3🔥🔥3🔥🔥3."
A-Z innehåller alla versaler och A-z innehåller alla gemener. Så denna gsub tar bort alla bokstäver och ersätter dem med fire emoji.
genvägar
det finns många användbara genvägar tillgängliga för att förenkla vad som skickas in i regex. Här är några av de mest användbara jag har hittat hittills:
- \w för att rikta in alla bokstäver och siffror:
lorem = "Lorem ipsum."
lorem.gsub(//, "wow") #returns "wowwowwowwowwow wowwowwowwowwow."
• \W för att göra det motsatta (i exemplet nedan ersätter det mellanslag och perioden i slutet med ”wow”):
lorem.gsub(//, "wow") #returns "Loremwowipsumwow"
- \d för inriktning på alla heltal:
lorem = "L0r3m 1psum"
lorem.gsub(//, "-") #returns "L-r-m -psum."
- \d att göra motsatsen
lorem.gsub(//, "-") #returns "-0-3--1-----"
det finns många fler genvägar och en bra resurs för detta jag hittade är Rubular, den har en lista över dem och låter dig testa dem i webbläsaren.
Block
block kan användas för att ändra hur .gsub beter sig. Här är ett exempel för att kapitalisera varje ord i en sträng:
cool_phrase = "slow lorises are cool"
cool_phrase.gsub(/\w+/) {|word| word.capitalize}
#returns "Slow Lorises Are Cool"
Obs: symbolen ” + ” efter \ w markerar varje ord som har 1 eller fler tecken. Utan ” + ”skulle hela strängen vara stor.
här är ett annat exempel där numret i en sträng ökas:
year = "The year is 3100"
year.gsub(/\d+/) {|num| num.to_i + 1} #returns "The year is 3101"
Obs: återigen väljer symbolen ” + ” varje nummer som har 1 eller flera nummer som helhet. Utan det skulle avkastningen vara” året är 4211 ” eftersom det skulle öka varje nummer individuellt.
användningsfall
reguljära uttryck används ofta för att validera eller filtrera användarinmatning. Tänk dig att din webbplats har ett formulär som tar in en användares telefonnummer. Här är ett exempel på att ta bort symbolerna för att bara få numret som ett heltal:
phone_number = "(123)456-7890"
phone_number.gsub(/, ""/) #returns "1234567890"
när du får användarens namn är det användbart att bara få en sträng bokstäver och ta bort allt de matar in som är ett nummer eller en symbol.
steve = "St97eve Brul()*)e "
steve.gsub(//, "").split(/(?=)/).join(" ")
#returns "Steve Brule"
ovanstående exempel ser lite komplicerat ut, men allt det gör är att ta bort alla symboler och siffror, dela resultatet i en array baserat på var stora bokstäver är och ansluta dem till en sträng.
slutsats och resurser
reguljära uttryck och .gsub är kraftfulla verktyg som kan förbättra ditt program, men att läsa och försöka lista ut dem kan ibland känna att du läser hieroglyfer (se bilden nedan). Jag rekommenderar att du tar dig tid att lära dig dem och försöka lista ut dem en i taget. Gör detta och snart kommer du att bli en regex mästare!