Kurzusok
/
Elixir
Elixir
/
Tanterv
/
Reguláris kifejezések
Re

Reguláris kifejezések ebben a kurzusban: Elixir

24 feladat

A(z) Reguláris kifejezések fogalomról

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

A regex szintaxis áttekintése

  • Egyes karakterek a reguláris kifejezés mintájában különleges jelentéssel bírnak; ahhoz, hogy a karaktert simán használjuk, escape-elni kell \-rel, pl. ~r/\?/.
  • A karakterosztályok (pl. \d, \w) lehetővé teszik, hogy a minták karakterek egy tartományára illeszkedjenek
  • Az alternációk (|) lehetővé teszik, hogy a minták egyik vagy másik mintára illeszkedjenek
  • A kvantorok ({N, M}, *, ?) lehetővé teszik, hogy a minták meghatározott számú ismétlődő mintára illeszkedjenek
  • A csoportok (()) lehetővé teszik, hogy a minták részei egységként működjenek

Elfogások

A 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"}

Módosítók

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
    
  • És még több: dotall, multiline, extended, firstline, ungreedy

Reguláris kifejezések dinamikus építése

Mivel 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

Reguláris kifejezések vs. a String modul

Bár a reguláris kifejezések hatékonyak, nem mindig bölcs dolog használni őket:

  • Használat előtt le kell fordítani őket, ez számítási időt és memóriát igényel.
  • Lassabbak lehetnek, mint a sima stringfüggvények használata.

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

Tanuld meg a(z) Reguláris kifejezések fogalmat

A gyakorlás zárolva

Oldj fel még 10 feladatot, hogy gyakorolhasd a(z) Reguláris kifejezések fogalmat