A reguláris kifejezések sokoldalú eszközt nyújtanak a stringek mintaillesztésére, egy erre a célra tervezett domain-specifikus nyelv (DSL) segítségével.
Ahogy sok más programozási nyelv, a Julia sem próbál saját regexkönyvtárat megvalósítani. Ehelyett a népszerű PCRE2 könyvtárat csomagolja be, így a regex szintaxisa megegyezik például a Gleamével, és nagyon hasonlít a Javascriptéhez.
Ez a Julia-tanterv feltételezi, hogy már ismered a regex alapvető szintaxisát. Kizárólag a Julia-specifikus jellemzőkre összpontosítunk.
Az alábbiakban néhány forrást találsz, amivel felfrissítheted a reguláris kifejezésekkel kapcsolatos ismereteidet.
A Julia reguláris kifejezésekhez kapcsolódó felületét a kézikönyv írja le.
A reguláris kifejezés a Juliában egyszerűen egy string, amelyet a nyitó " előtt egy r előz meg.
Az összes alapvető funkció a standard könyvtár része.
Valójában a Strings fogalomban már tárgyalt függvények közül sok eleve regexes keresésre készült, például az occursin().
julia> re = r"test$"
r"test$"
julia> typeof(re)
Regex
# Does a string end with "test"?
julia> occursin(re, "this is a test")
true
julia> occursin(re, "these are tests")
false
A záró idézőjel után módosító karakterek állhatnak, például az i a kis- és nagybetűt nem megkülönböztető illesztéshez.
julia> occursin(r"test", "Testing")
false
julia> occursin(r"test"i, "Testing")
true
Gyakran szeretnénk tudni, hogy mi illeszkedik. Ezt úgy érhetjük el, hogy elfogó csoportokat teszünk zárójelbe a regexen belül, majd a match() függvényt használjuk.
julia> m = match(r"(\d+g) .* (\d+ml)", "dissolve 25g sugar in 200ml water")
RegexMatch("25g sugar in 200ml", 1="25g", 2="200ml")
julia> m.captures
2-element Vector{Union{Nothing, SubString{String}}}:
"25g"
"200ml"
# how many matches?
julia> length(m.captures)
2
# what matched?
julia> m[1], m[2]
("25g", "200ml")
# Starting positions of the matches (character index)
julia> m.offsets
2-element Vector{Int64}:
10
23
Az illesztés persze sikertelen is lehet.
Ilyenkor az eredmény a RegexMatch helyett a speciális Nothing érték lesz, ezért készülj fel ennek ellenőrzésére.
# failed match
m = match(r"(not here)", "dissolve 25g sugar in 200ml water")
julia> typeof(m)
Nothing
julia> isnothing(m)
true
Bár a match alapértelmezés szerint a string elejétől indul, megadhatunk egy n eltolást is, hogy figyelmen kívül hagyjuk az első n karaktert.
# capture first match
julia> m = match(r"(\wat)", "cat, sat, mat")
RegexMatch("cat", 1="cat")
# ignore first 5 characters, then match
julia> m = match(r"(\wat)", "cat, sat, mat", 5)
RegexMatch("sat", 1="sat")
A Juliában a match() csak az első illeszkedést találja meg a cél stringben: nincs globális módosító, mint néhány más nyelvben.
Ehelyett ott van az eachmatch(), amely az illeszkedések egy iterátorát adja vissza.
Ez lusta kiértékelésű, ezért lehet, hogy a kívánt formátumba kell alakítanod.
julia> matches = eachmatch(r"(\wat)", "cat, sat, mat")
Base.RegexMatchIterator{String}(r"(\wat)", "cat, sat, mat", false)
# convert to vector
julia> collect(matches)
3-element Vector{RegexMatch}:
RegexMatch("cat", 1="cat")
RegexMatch("sat", 1="sat")
RegexMatch("mat", 1="mat")
# convert with comprehension
julia> [m.match for m in matches]
3-element Vector{SubString{String}}:
"cat"
"sat"
"mat"
# broadcast an anonymous function
julia> (m -> m.match).(matches)
3-element Vector{SubString{String}}:
"cat"
"sat"
"mat"
A regex használatának egyik gyakori oka, hogy az illeszkedést egy másik stringre cseréljük.
A replace() függvényt a Strings fogalomban már tárgyaltuk, ahol stringliterálokra kerestünk vele.
Ugyanez a függvény ki tudja használni a regexes illesztés teljes erejét.
julia> replace("some string", r"[aeiou]" => "*")
"s*m* str*ng"
julia> replace("first second", r"(\w+) (?<agroup>\w+)" => s"\g<agroup> \1")
"second first"
A fenti második példa megmutatja, hogyan használhatók a sorszámozott és a nevesített elfogó csoportok is a helyettesítésben, egy s" " stringen belül.
További részletekért lásd a kézikönyvet: ez egy olyan téma, amely folyton visszatereli a legtöbb programozót a dokumentációhoz!
Reguláris kifejezések specialistájaként vettek fel egy cégnél, amely éppen egy Chatbotot fejleszt.
A fejlesztés nagyon kezdeti szakaszában jár, ezért a küldetésed, hogy reguláris kifejezésekkel javítsd a Chatbot képességét a természetes nyelv megértésére és előállítására.
Hogy tanulhass, kérünk, oldd meg ezeket a részfeladatokat reguláris kifejezésekkel.
Tudjuk, hogy néha más megoldások is lehetségesek (és akár gyorsabbak is lehetnek!)
A Chatbot az okossága mellett hűséges segítő is.
Ahhoz, hogy kérdezhessen tőle valamit, a felhasználónak a parancs első helyén ki kell mondania a „Chatbot” szót.
Nem számít, hogy a kulcsszó csupa nagy- vagy csupa kisbetűvel szerepel-e. Itt a szó pozíciója a lényeg.
Készítsd el az is_valid_command() függvényt, amely segít a Chatbotnak felismerni, amikor a felhasználó parancsot ad.
julia> is_valid_command("Chatbot, play a song from the 80's.")
True
julia> is_valid_command("Hey Chatbot, where is the closest pharmacy?")
False
julia> is_valid_command("CHATBOT, do you have a solution for this challenge?")
True
A Chatbot nehezen érti meg, hogyan használják az emberek az emojikat az érzelmeik kifejezésére.
Amikor a Chatbot üzeneteket kap a felhasználótól, minden emoji „emoji” formában, utána pedig az id számával jelenik meg.
Készítsd el a remove_emoji() metódust, amely egy stringet kap, és eltávolítja az üzenetből az összes emoji titkosítását.
Azeket a sorokat, amelyek nem tartalmaznak emoji-szöveget, változatlanul kell visszaadni.
Csak az emoji szövegét távolítsd el. Ne próbáld módosítani a szóközöket.
julia> remove_emoji("I love playing videogames emoji3465 it's one of my hobbies")
"I love playing videogames it's one of my hobbies"
Mivel a Chatbot funkcióit mobilalkalmazásban is le lehet tölteni, a felhasználónak a beszélgetés során telefonszámot kell megadnia.
A probléma az, hogy a Chatbot csak egy adott formátumú számot tud beolvasni és ellenőrizni.
Ha a szám érvényes (megfelel a reguláris kifejezésben megadott karaktersorozatnak), a Chatbot egy üzenettel válaszol, amelyben megköszöni a felhasználónak, és megerősíti a számot. Ha a szám érvénytelen, a függvény tájékoztatja a felhasználót, hogy a telefonszám nem érvényes.
A várt formátum: (+##) ###-###-###
julia> check_phone_number("(+34) 659-771-594")
"Thanks! You can now download me to your phone."
julia> check_phone_number("659-771-594")
"Oops, it seems like I can't reach out to 659-771-594"
A Chatbot igazán kíváncsi szoftver. Bár egy adott témáról maga is tud keresni az interneten, szeret a felhasználóktól érdekes weboldalak vagy URL-ek felől érdeklődni, hogy releváns információkra leljen.
Példa egy beszélgetésre:
Készítsd el a getURL() függvényt, amely egy tömbbel tér vissza, és abban csak az egyes weboldalak linkje szerepel.
julia> getURL("I learned a lot from exercism.org")
["exercism.org"]
Ahhoz, hogy eltárolja mindazok adatait, akikkel beszélgetett, a Chatbot a felhasználó profiljából képes kiolvasni a teljes nevet ilyen formában: „smith, john”.
Így szeretnénk, hogy a Chatbotunk igazán udvarias legyen, és jó benyomást keltsen.
Írd meg a nice_to_meet_you() függvényt, amely egy stringet kap a felhasználó teljes nevével, és a „Nice to meet you, John Smith” stringgel tér vissza.
julia> str = "Smith, John"
julia> nice_to_meet_you(str)
"Nice to meet you, John Smith"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.