Regulární výrazy (zkrácena na regex) jsou zvyklí pracovat na vzory nalezené v řetězce. Mohou najít, nahradit nebo odstranit určité části řetězců v závislosti na tom, co jim řeknete. V Ruby jsou vždy obsaženy ve dvou předních lomítkách.
například pomocí .metoda gsub pro řetězce:
sentence = "This is a sample sentence."
sentence.gsub(/a/, "") #returns "This is smple sentence."
na .metoda gsub je nalezení všech a v řetězci a jejich odstranění, protože druhá polovina argumentu je prázdná. Kdybychom měli přidat něco mezi uvozovky:
sentence.gsub(/This/, "*") #returns "* is a sample sentence."
pak najde a nahradí všechny instance „toto“ hvězdičkou (*). Existuje způsob, jak tuto funkci také zvrátit, přidání stříšky ( ^ ) v přední části regulárního výrazu udělá pravý opak:
sentence.gsub(//, "*") #returns "********a**a**************"
všechno (včetně prostorů!) v řetězci, který není a, je nahrazován hvězdičkami. Všimněte si, že pro použití této funkce jsou nutné hranaté závorky (), bez nich gsub nic neudělá.
do regulárního výrazu je možné předat rozsahy čísel nebo písmen, abyste se nemuseli zadávat každé písmeno v abecedě nebo všechna čísla 0 až 9.
sentence = "Th1s 1s a sampl3 s3nt3nc3."
sentence.gsub(//, "!") #these return the same thing
sentence.gsub(//, "!") # "Th!s !s a sampl! s!nt!nc!."
a pro rozsahy písmen:
sentence.gsub(//, "🔥")
#returns "🔥🔥1🔥 1🔥 🔥 🔥🔥🔥🔥🔥3 🔥3🔥🔥3🔥🔥3."
A-Z zahrnuje všechna velká písmena A a-z zahrnuje všechna malá písmena. Takže tento gsub odstraní všechna písmena a nahradí je ohněm emoji.
zkratky
existuje mnoho užitečných zkratek pro zjednodušení toho, co se předává do regulárního výrazu. Zde jsou některé z nejužitečnějších, které jsem dosud našel:
- \w pro cílení na všechny písmena a čísla:
lorem = "Lorem ipsum."
lorem.gsub(//, "wow") #returns "wowwowwowwowwow wowwowwowwowwow."
• \W opak (v příkladu níže je výměna míst a období, na konci s „wow“):
lorem.gsub(//, "wow") #returns "Loremwowipsumwow"
- \d pro cílení všechna celá čísla:
lorem = "L0r3m 1psum"
lorem.gsub(//, "-") #returns "L-r-m -psum."
- \D dělat opak
lorem.gsub(//, "-") #returns "-0-3--1-----"
Existuje mnoho dalších zkratky a skvělý zdroj pro toto jsem našel, je Rubular, to má seznam z nich, a vám umožní vyzkoušet si je v prohlížeči.
bloky
bloky lze použít ke změně způsobu .gsub se chová. Zde je příklad pro psaní velkých písmen každého slova v řetězci:
cool_phrase = "slow lorises are cool"
cool_phrase.gsub(/\w+/) {|word| word.capitalize}
#returns "Slow Lorises Are Cool"
Poznámka: symbol „+“ po \w je výběr každé slovo, které má 1 nebo více znak. Bez “ + “ by celý řetězec byl velká písmena.
Zde je další příklad, kde číslo v řetězci je zvýšen:
year = "The year is 3100"
year.gsub(/\d+/) {|num| num.to_i + 1} #returns "The year is 3101"
Poznámka: opět platí, že symbol „+“ je volba každé číslo, které má 1 nebo více číslo jako celek. Bez ní by návrat byl „rok je 4211“, protože by zvyšoval každé číslo jednotlivě.
případy použití
regulární výrazy se často používají k ověření nebo filtrování vstupu uživatele. Představte si, že váš web má formulář, který obsahuje telefonní číslo uživatele. Zde je příklad odstranění symbolů získat pouze číslo jako celé číslo:
phone_number = "(123)456-7890"
phone_number.gsub(/, ""/) #returns "1234567890"
Při získávání jméno uživatele, je užitečné získat pouze na řetězec písmen a odstranit vše, že vstup, který je číslo, nebo symbol.
steve = "St97eve Brul()*)e "
steve.gsub(//, "").split(/(?=)/).join(" ")
#returns "Steve Brule"
výše uvedený příklad vypadá trochu složité, nicméně vše, co dělá, je, že odstraní všechny symboly a čísla, rozdělit výsledek do pole založené na tom, kde velkými písmeny jsou, a spojující je do řetězce.
závěr a zdroje
regulární výrazy a .gsub jsou výkonné nástroje, které mohou zlepšit váš program, ale čtení a snaží se přijít na ně může někdy pocit, že jste čtení hieroglyfy (viz obrázek níže). Doporučuji, abyste si udělali čas na jejich učení a snažili se je zjistit jeden po druhém. Udělej to a brzy budeš regex mistr!