Kurzusok
/
Julia
Julia
/
Feladatok
/
Reguláris chatbot
Reguláris chatbot

Reguláris chatbot

Tanulófeladat

Bevezetés

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.

Note

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

Elfogó csoportok

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"

Csere

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!

Utasítások

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.

Note

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!)

1. Érvényes parancs ellenőrzése

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

2. Titkosított emojik eltávolítása

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"

3. Érvényes telefonszám ellenőrzése

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"

4. Weboldal linkjének megszerzése

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:

  • Chatbot: Szia felhasználó, szeretném megtanulni, hogyan kell JavaScriptben programozni. Ismersz valami jó weboldalt, ahol tanulhatnék?
  • Felhasználó: Sokat tanultam az exercism.org oldalon

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"]

5. Köszöntsd a felhasználót

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"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Julia Exercism

Készen állsz elkezdeni a(z) Reguláris chatbot feladatot?

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.