Regex tutorial  —  Cheatsheet by examples

Izvor: Jonny Fox, Medium

Regularni izrazi (regex ili regexp) su izuzetno korisni u izvlačenju informacija iz bilo kog teksta traženjem jednog ili više podudaranja određenog obrasca pretrage (tj. određenog niza ASCII ili unikod znakova).

Polja primene se kreću od provere valjanosti do raščlanjivanja/zamene stringova, prolaska kroz prevođenje podataka u druge formate i veb skrapinga.

Jedna od najzanimljivijih karakteristika je da kada se nauči sintaksa, ovaj alat može da se koristi u (skoro) svim programskim jezicima (JavaScript, Java, VB, C #, C / C++, Pithon, Perl, Rubi , Delphi, R, Tcl, d mnogi drugi) sa najmanjim razlikama u pogledu podrške najnaprednijih funkcija i verzija sintakse koje podržavaju mašine.

Evo nekih primerima i objašnjenja.

^The odgovara bilo kom nizu koji počinje sa The
end$ odgovara nizu koji se završava sa end
^The end$ tačno podudaranje niza (počinje i završava se sa The end)
roar odgovara bilo kom stringu koji ima tekst roar u sebi

abc* odgovara nizu koji ima ab praćeno sa nula ili više c
abc+ odgovara nizu koji ima ab praćeno sa jedanim ili više c
abc? odgovara nizu koji ima ab praćeno sa nula ili jedanim c
abc{2} odgovara nizu koji ima ab praćeno sa 2 c
abc{2,} odgovara nizu koji ima ab praćeno sa 2 ili više c
abc{2,5} odgovara nizu koji ima ab praćeno sa 2 do 5 c
a(bc)* odgovara nizu koji ima a praćeno sa nula ili više kopija niza bc
a(bc){2,5} odgovara nizu koji ima a praćeno sa 2 do 5 kopija niza bc

a(b|c) odgovara nizu koji ima a praćeno sa b ili c
a[bc] isto kao i prethodni

\d odgovara jedan karakter koji je cifra
\w odgovara znaku reči (alfanumerički znak plus donja crta)
\s odgovara razmaku (uključuje tabulatore i prelome redova)
. odgovara bilo koji karakter

Pažljivo koristite operator . jer su često klasa ili negirana klasa znakova (o čemu ćemo dalje govoriti) brži i precizniji.

\d, \w i \s takođe predstavljaju svoje negacije sa \D, \W i \S respektivno .

Na primer, \D će izvršiti obrnuto podudaranje u odnosu na ono dobijeno sa \d.
\D odgovara jedan necifren znak.

Da biste bili shvaćeni bukvalno, morate izbeći znakove ^.[$()|*+?{ obrnutom kosom crtom jer oni imaju posebno značenje.
$d odgovara nizu koji ima $ ispred jedne cifre.

Imajte na umu da možete da uparite i znakove koji se ne mogu štampati kao što su tabulatori \t, novi redovi \n, znakovi koji se vraćaju \r.

\s odgovara bilo kom znaku razmaka. To je ekvivalentno izlaznim sekvencama i Unicode kategorijama navedenim u sledećoj tabeli.

KategorijaOpis
\fZnak za novi obrazac (FF), \u000C.
\nZnak za novu liniju (LF), \u000A.
\rPovratni karakter (CR), \u000D.
\tTab znak, \u0009.
\vVertikalni tab znak, \u000B.
\x85Znak NEXT LINE (NEL), \u0085.
\p{Z}Odgovara svim znakovima za razdvajanje. Ovo uključuje kategorije Zs, Zl i Zp.

Učimo kako da konstruišemo regularni izraz, ali zaboravljamo osnovni koncept: zastave.

Redovni izraz se obično nalazi u ovom obliku /abc/, gde je obrazac pretrage razgraničen sa dve kose crte (/).
Na kraju možemo navesti zastavu sa ovim vrednostima (takođe ih možemo kombinovati jedna sa drugom):

\g (globalni) se ne vraća posle prvog podudaranja, ponovo pokreće sledeće pretrage od kraja prethodnog podudaranja
\m (višelinijski)kada je omogućeno ^ i $ će odgovarati početku i kraju reda, umesto celog niza
\i (neosetljivo) čini ceo izraz neosetljivim na velika i mala slova (na primer /aBc/i bi odgovaralo AbC)

Međuteme

Zagrade a(bc) stvaraju grupu za snimanje sa vrednošću bc
a(?:bc)* koristeći ?: onemogućavamo grupu za snimanje bc
a(?<foo>bc) koristeći ?<foo> dali smo ime grupi bc

Ovaj operator je veoma koristan kada treba da izvučemo informacije iz nizova ili podataka koristeći željeni programski jezik. Svako višestruko pojavljivanje koje uhvati nekoliko grupa biće izloženo u obliku klasičnog niza: pristupićemo njihovim vrednostima specificirajući pomoću indeksa na rezultatu podudaranja.

Ako odlučimo da damo ime grupama (koristeći (?<foo>…)), moći ćemo da preuzmemo vrednosti grupe koristeći rezultat podudaranja kao rečnik gde će ključevi biti ime svake grupe .

[abc] podudara se sa nizom koji ima ili a ili b ili c koje je isto kao a|b|c
[a-c] isto kao i prethodni
[a-fA-F0-9] niz koji predstavlja jednu heksadecimalnu cifru, bez obzira na velika i mala slova
[0-9]% niz koji ima karakter od 0 do 9 pre znaka %
[^a-zA-Z] niz koji nema slovo od a do z ili od A do Z. U ovom slučaju se ^ koristi kao negacija izraza

Imajte na umu da svi posebni znakovi unutar izraza u zagradama (uključujući obrnutu kosu crtu) ​​gube svoja posebna ovlašćenja: stoga nećemo primeniti „pravilo bežanja“.

Kvantifikatori ( * + {}) su *pohlepni operatori*, tako da proširuju podudaranje koliko god mogu kroz dati tekst.

Na primer, <.+> odgovara <div>simple div</div> u This is a <div>simple div</div> test. Da bismo uhvatili samo oznaku div, možemo koristiti ? da je učinimo lenjim
<.+?> podudara se sa bilo kojim znakom jedan ili više puta uključenim unutar < i >, proširujući po potrebi.

Primetite da bi bolje rešenje trebalo da izbegava upotrebu . u korist strožijeg redovnog izraza: <[^<>]+> odgovara bilo kom znaku osim < ili > jednom ili više puta uključenim unutar < i >.


Napredne teme

\babc\b vrši “samo cele reči” pretragu

\b predstavlja sidro kao karet (slično je kao $ i ^) odgovarajućim pozicijama gde je jedna strana karakter reči (kao \ v), a druga strana nije karakter reči (na primer, može biti početak stringa ili razmak).

Dolazi sa svojom negacijom, \B. Ovo se poklapa sa svim pozicijama na kojima se \b ne podudara i može biti ako želimo da pronađemo obrazac pretrage u potpunosti okružen znakovima reči. \Babc\B se podudara samo ako je obrazac potpuno okružen znakovima reči.

([abc])\1 koristeći \1 odgovara istom tekstu koji je upario prva grupa za snimanje.
([abc])([de])\2\1 možemo da koristimo \2 (3, 4, itd.) da identifikujemo isti tekst koji je podudarala druga (treća, četvrta, itd.) grupa za snimanje.
(?<foo>[abc])\k<foo> grupi stavljamo ime foo i referenciramo ga kasnije (k<foo>). Rezultat je isti kao prvi regularni izraz.

d(?=r) odgovara „d“ samo ako ga prati r, ali „r“ neće biti deo ukupnog podudaranja regularnog izraza.
(?⇐r)d odgovara „d“ samo ako mu prethodi r, ali r neće biti deo ukupnog podudaranja regularnog izraza.

Možete koristiti i operator negacije!

d(?!r) odgovara „d“ samo ako ne prati r, ali r neće biti deo ukupnog podudaranja regularnog izraza.
(?<!r)d odgovara „d“ samo ako mu ne prethodi r, ali r neće biti deo ukupnog podudaranja regularnog izraza.

  • kb/zapisi/regex_main.txt
  • Last modified: 2023/08/16 09:11
  • by milano