A reguláris kifejezések (regex) hatékony eszközök a stringekkel való munkához Elixirben. Az Elixirben a reguláris kifejezések a PCRE specifikációt (Perl Compatible Regular Expressions) követik. A reguláris kifejezés jelentését reprezentáló stringmintákat először le kell fordítani, majd a string egészének vagy egy részének illesztésére használjuk.
Elixirben a reguláris kifejezések létrehozásának leggyakoribb módja a ~r sigil használata. A sigilek szintaktikai cukor rövidítéseket biztosítanak az Elixir gyakori feladataihoz. Ebben az esetben a ~r a Regex.compile!/2 használatának rövidítése.
Regex.compile!("test") == ~r/test/
# => true
A =~/2 operátor hasznos egy stringen végzett regex illesztés elvégzéséhez, hogy boolean eredményt adjon vissza.
"this is a test" =~ ~r/test/
# => true
\-rel, pl. ~r/\?/.\d, \w) lehetővé teszik, hogy a minták karakterek egy tartományára illeszkedjenek|) lehetővé teszik, hogy a minták egyik vagy másik mintára illeszkedjenek{N, M}, *, ?) lehetővé teszik, hogy a minták meghatározott számú ismétlődő mintára illeszkedjenek()) lehetővé teszik, hogy a minták részei egységként működjenekA reguláris kifejezések arra is hasznosak, hogy egy string egy részét kinyerjük. Ezt elfogásnak nevezzük. Egy string egy részének elfogásához hozz létre egy csoportot (()) annak a résznek, amelyet el akarsz fogni, és használd a Regex.run függvényt.
Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]
Az elfogások sorszámozottak (1-től kezdve), és a string egyes részeinek reguláris kifejezéssel való cseréjekor az eredményben is használhatók:
Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"
Az elfogások névvel is elláthatók, ha a nyitó zárójel után ?<name>-t fűzünk. A Regex.named_captures/3 függvénnyel egy map-et kapunk a nevesített elfogásokkal.
Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}
A reguláris kifejezés viselkedése módosítható speciális jelzők hozzáfűzésével a reguláris kifejezés végén, pl. ~r/test/i.
caseless i - kis- és nagybetűre érzéketlen
"A" =~ ~r/a/
# => false
"A" =~ ~r/a/i
# => true
unicode u - engedélyezi az Unicode-specifikus mintákat, mint a \p, és azt eredményezi, hogy a karakterosztályok, például a \w stb. is illeszkedjenek Unicode-ra
"ö" =~ ~r/^\w$/
# => false
"ö" =~ ~r/^\w$/u
# => true
dotall, multiline, extended, firstline, ungreedyMivel a ~r sigil rövidítés a "pattern" |> Regex.escape() |> Regex.compile!() kifejezésre, string interpolációval is dinamikusan építhetsz reguláris kifejezésmintát:
anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true
String modulBár a reguláris kifejezések hatékonyak, nem mindig bölcs dolog használni őket:
Ökölszabályként jobb, ha lehet, a String modul függvényeit használod.
# Don't use regular expressions to check a suffix:
if "YELLING!" =~ ~r/!$/, do: "Whoa, chill out!"
# Use a string function:
if String.ends_with?("YELLING!", "!"), do: "Whoa, chill out!"