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

Reguláris kifejezések ebben a kurzusban: jq

1 feladat

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

A reguláris kifejezések (regexek) olyan karaktersorozatok, amelyek egy keresési mintát írnak le egy szövegben.

A reguláris kifejezések szintaxisának megtanulása túlmutat e témakör keretein. Arra összpontosítunk, hogy a jq milyen kifejezéseket kínál a regexek használatához.

A regexváltozat

A különböző eszközök a reguláris kifejezések különböző változatait valósítják meg. A jq az Oniguruma regexkönyvtárat használja, amely nagyrészt kompatibilis a Perl v5.8 regexeivel.

A jq által használt konkrét szintaxis megtalálható az Oniguruma GitHub-tárolójában.

Caution

A jq-nak nincs külön szintaxisa a reguláris kifejezésekhez. Egyszerűen stringként adjuk meg őket. Ez azt jelenti, hogy a reguláris kifejezésben szereplő visszaperjeleket escape-elni kell a stringben.

Például a számjegy karakterosztályt (\d) így kell írni: "\\d".

Regexfüggvények

A jq-ban a reguláris kifejezések szűrők egy csoportjára korlátozódnak.

Egyszerű illesztés

Amikor tudni szeretnéd, hogy egy string illeszkedik-e egy mintára, használd a test szűrőt.

STRING | test(REGEX)
STRING | test(REGEX; FLAGS)
STRING | test([REGEX, FLAGS])

Ez a szűrő boolean eredményt ad.

"Hello World!" | test("W")    # => true
"Goodbye Mars" | test("W")    # => false

Információk az egyezésről

Amikor ki kell nyerned azt a részstringet, amely ténylegesen illeszkedett a mintára, használd a match szűrőt.

STRING | match(REGEX)
STRING | match(REGEX; FLAGS)
STRING | match([REGEX, FLAGS])

Ez a szűrő a következőt adja vissza:

  • semmit, ha nem volt egyezés, vagy
  • egy objektumot, amely különféle tulajdonságokat tartalmaz, ha volt egyezés.

Ez a példa két azonos, egymást követő magánhangzót keres a visszahivatkozás szintaxisával, \1.

"Hello World!" | match("([aeiou])\\1")
# => empty

"Goodbye Mars" | match("([aeiou])\\1")
# => {
#      "offset": 1,
#      "length": 2,
#      "string": "oo",
#      "captures": [
#        {
#          "offset": 1,
#          "length": 1,
#          "string": "o",
#          "name": null
#        }
#      ]
#    }

A match szűrő minden egyezéshez visszaad egy objektumot. Ez a példa a "g" jelző működését mutatja be, amellyel az összes magánhangzót megkereshetjük.

"Goodbye Mars" | match("[aeiou]"; "g")
# => { "offset": 1, "length": 1, "string": "o", "captures": [] }
#    { "offset": 2, "length": 1, "string": "o", "captures": [] }
#    { "offset": 6, "length": 1, "string": "e", "captures": [] }
#    { "offset": 9, "length": 1, "string": "a", "captures": [] }

Elkapott részstringek

A match szűrőhöz hasonlóan a capture szűrő is egy objektumot ad vissza, ha volt egyezés.

STRING | capture(REGEX)
STRING | capture(REGEX; FLAGS)
STRING | capture([REGEX, FLAGS])

A visszaadott objektum a nevesített csoportok leképezése.

"JIRAISSUE-1234" | capture("(?<project>\\w+)-(?<issue_num>\\d+)")
# => {
#      "project": "JIRAISSUE",
#      "issue_num": "1234"
#    }

Csak a részstringek

A scan szűrő hasonló a "g" jelzővel használt match szűrőhöz.

STRING | scan(REGEX)
STRING | scan(REGEX; FLAGS)

# note, there is no scan([REGEX, FLAGS]) version, unlike other filters

A scan részstringek egy folyamát adja vissza.

"Goodbye Mars" | scan("[aeiou]")
# => "o"
#    "o"
#    "e"
#    "a"

A részstringek összegyűjtéséhez használd a [...] tömbkonstruktort.

"Goodbye Mars" | [ scan("[aeiou]") ]
# => ["o", "o", "e", "a"]

String felbontása

Ha tudod, hogy a string mely részeit szeretnéd megtartani, használd a match vagy a scan szűrőt. Ha tudod, hogy mely részeit szeretnéd eldobni, használd a split szűrőt.

STRING | split(REGEX; FLAGS)
Caution

Az egyargumentumos split szűrő a paraméterét rögzített stringként kezeli.

Ahhoz, hogy regexet használj a split-tel, meg kell adnod a második argumentumot; használhatsz üres stringet is.

Egy példa, amely egy stringet tetszőleges whitespace mentén bont fel.

"first   second           third fourth" | split("\\s+"; "")
# => ["first", "second", "third", "fourth"]
Note

Ez történik, ha elfelejtjük a jelző argumentumot.

"first   second           third fourth" | split("\\s+")
# => ["first   second           third fourth"]

Csak egyetlen eredmény: a rögzített string \s+ nem szerepelt a bemenetben.

Az egyargumentumos split nem tud mit kezdeni a tetszőleges whitespace-szel. Ha szóköz mentén bontunk fel, ezt az eredményt kapjuk.

"first   second           third fourth" | split(" ")
# => ["first", "", "", "second", "", "", "", "",
#     "", "", "", "", "", "", "third", "fourth" ]

Helyettesítések

A sub és a gsub szűrő átalakíthatja a bemeneti stringet: a bemenet egyező részeit egy helyettesítő stringgel cseréli le.

Ha csak az első egyezést szeretnéd lecserélni, használd a sub szűrőt. Ha az összes egyezést le szeretnéd cserélni, használd a gsub szűrőt.

STRING | sub(REGEX; REPLACEMENT)
STRING | sub(REGEX; REPLACEMENT; FLAGS)
STRING | gsub(REGEX; REPLACEMENT)
STRING | gsub(REGEX; REPLACEMENT; FLAGS)
"Goodnight kittens. Goodnight mittens." | sub("night"; " morning")
# => "Good morning kittens. Goodnight mittens."

"Goodnight kittens. Goodnight mittens." | gsub("night"; " morning")
# => "Good morning kittens. Good morning mittens."

A helyettesítő szöveg hivatkozhat az egyező részstringekre; használj nevesített csoportokat és string-interpolációt.

"Some 3-letter acronyms: gnu, csv, png"
| gsub( "\\b(?<tla>[[:alpha:]]{3})\\b";     # find words 3 letters long
        "\(.tla | ascii_upcase)" )          # upper-case the match
# => "Some 3-letter acronyms: GNU, CSV, PNG"

Jelzők

A fenti szűrők mindegyikében a FLAGS egy string, amely a támogatott jelzők közül nulla vagy többet tartalmaz.

  • g - Globális keresés (az összes egyezést megtalálja, nem csak az elsőt)
  • i - Kis- és nagybetűt nem megkülönböztető keresés
  • m - Többsoros mód (a '.' az újsorokra is illeszkedik)
  • n - Az üres egyezések figyelmen kívül hagyása
  • p - Az s és az m mód is engedélyezve van
  • s - Egysoros mód ('^' -> '\A', '$' -> '\Z')
  • l - A lehető leghosszabb egyezések keresése
  • x - Kiterjesztett regexformátum (a whitespace és a megjegyzések figyelmen kívül hagyása)

Például

"JIRAISSUE-1234" | capture("(?<project>\\w+)-(?<issue_num>\\d+)")

# or with Extended formatting

"JIRAISSUE-1234" | capture("
                     (?<project>   \\w+ )  # the Jira project
                     -                     # followed by a hyphen
                     (?<issue_num> \\d+ )  # followed by digits
                   "; "x")
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 1 feladatot, hogy gyakorolhasd a(z) Reguláris kifejezések fogalmat