Both sides previous revision Previous revision Next revision | Previous revisionLast revisionBoth sides next revision |
kb:zapisi:regex_main [2023/08/15 13:48] – [OR operator — | or []] milano | kb:zapisi:regex_main [2023/08/16 09:10] – [Look-ahead and Look-behind — (?=) and (?<=)] milano |
---|
Evo nekih primerima i objašnjenja. | Evo nekih primerima i objašnjenja. |
| |
===== Sidra — ^ and $ ===== | ===== Sidra — ^ i $ ===== |
| |
''^The'' odgovara bilo kom nizu koji počinje sa **The**\\ | ''^The'' odgovara bilo kom nizu koji počinje sa **The**\\ |
''roar'' odgovara bilo kom stringu koji ima tekst **roar** u sebi \\ | ''roar'' odgovara bilo kom stringu koji ima tekst **roar** u sebi \\ |
| |
===== Quantifiers — * + ? and {} ===== | ===== Kvantifikatori — * + ? i {} ===== |
''abc*****'' odgovara nizu koji ima **ab** praćeno sa //nula ili više// **c** \\ | ''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 //jedanim ili više// **c** \\ |
''a(bc){2,5}****'' odgovara nizu koji ima **a** praćeno sa //2 do 5 kopija niza// **bc** \\ | ''a(bc){2,5}****'' odgovara nizu koji ima **a** praćeno sa //2 do 5 kopija niza// **bc** \\ |
| |
===== OR operator — | or [] ===== | ===== ILI operater — | ili [] ===== |
| |
''a(b|c)'' odgovara stringu koji ima **a** praćeno **b** //ili// **c** | ''a(b|c)'' odgovara nizu koji ima **a** praćeno sa **b** //ili// **c** \\ |
''a[bc]'' isto kao i prethodni | ''a[bc]'' isto kao i prethodni |
| |
===== Character classes — d w s and . ===== | ===== Klase karaktera — d w s i . ===== |
| |
''\d'' matches a **single character** that is a **digit** \\ | ''\d'' odgovara **jedan karakter** koji je **cifra** \\ |
''\w'' matches a **word character** (alphanumeric character plus underscore) \\ | ''\w'' odgovara **znaku reči** (alfanumerički znak plus donja crta) \\ |
''\s'' matches a **whitespace character** (includes tabs and line breaks) \\ | ''\s'' odgovara **razmaku** (uključuje tabulatore i prelome redova) \\ |
''.'' matches **any character** \\ | ''.'' 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. | Pažljivo koristite operator ''.'' jer su često klasa ili negirana klasa znakova (o čemu ćemo dalje govoriti) brži i precizniji. |
| |
''\d'', ''\w'' and ''\s'' also present their **negations** with ''\D'', ''\W'' and ''\S'' respectively. \\ | ''\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''. \\ | Na primer, ''\D'' će izvršiti obrnuto podudaranje u odnosu na ono dobijeno sa ''\d''. \\ |
''\D'' odgovara **jedan necifren znak**. | ''\D'' odgovara **jedan necifren znak**. |
| |
In order to be taken literally, you must escape the characters ''^.[$()|*+?{'' with a **backslash** as they have special meaning. \\ | Da biste bili shvaćeni bukvalno, morate izbeći znakove ''^.[$()|*+?{'' **obrnutom kosom crtom** jer oni imaju posebno značenje. \\ |
''$d'' matches a string that has a **$** before one digit. | ''$d'' odgovara nizu koji ima **$** ispred jedne cifre. |
| |
Notice that you can match also **non-printable characters** like tabs ''\t'', new-lines ''\n'', carriage returns ''\r''. | 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''. |
| |
==== Whitespace character: \s ==== | ==== Znak razmaka: \s ==== |
\s matches any whitespace character. It is equivalent to the escape sequences and Unicode categories listed in the following table. | \s odgovara bilo kom znaku razmaka. To je ekvivalentno izlaznim sekvencama i Unicode kategorijama navedenim u sledećoj tabeli. |
| |
^Category^Description| | ^Kategorija^Opis| |
|\f|The form feed character, \u000C.| | |\f|Znak za novi obrazac (FF), \u000C.| |
|\n|The newline character, \u000A.| | |\n|Znak za novu liniju (LF), \u000A.| |
|\r|The carriage return character, \u000D.| | |\r|Povratni karakter (CR), \u000D.| |
|\t|The tab character, \u0009.| | |\t|Tab znak, \u0009.| |
|\v|The vertical tab character, \u000B.| | |\v|Vertikalni tab znak, \u000B.| |
|\x85|The NEXT LINE (NEL) character, \u0085.| | |\x85|Znak NEXT LINE (NEL), \u0085.| |
|\p{Z}|Matches all separator characters. This includes the Zs, Zl, and Zp categories.| | |\p{Z}|Odgovara svim znakovima za razdvajanje. Ovo uključuje kategorije Zs, Zl i Zp.| |
| |
===== Flags ===== | ===== Zastave ===== |
| |
We are learning how to construct a regex but forgetting a fundamental concept: **flags**. | Učimo kako da konstruišemo regularni izraz, ali zaboravljamo osnovni koncept: **zastave**. |
| |
A regex usually comes within this form **/abc/**, where the search pattern is delimited by two slash characters (/). \\ | Redovni izraz se obično nalazi u ovom obliku **/abc/**, gde je obrazac pretrage razgraničen sa dve kose crte (/). \\ |
At the end we can specify a flag with these values (we can also combine them each other): | Na kraju možemo navesti zastavu sa ovim vrednostima (takođe ih možemo kombinovati jedna sa drugom): |
| |
''\g'' (global) does not return after the first match, restarting the subsequent searches from the end of the previous match \\ | ''\g'' (globalni) se ne vraća posle prvog podudaranja, ponovo pokreće sledeće pretrage od kraja prethodnog podudaranja \\ |
''\m'' (multi-line) when enabled ''^'' and ''$'' will match the start and end of a line, instead of the whole string \\ | ''\m'' (višelinijski)kada je omogućeno ''^'' i ''$'' će odgovarati početku i kraju reda, umesto celog niza \\ |
''\i'' (insensitive) makes the whole expression case-insensitive (for instance **/aBc/i** would match **AbC**) \\ | ''\i'' (neosetljivo) čini ceo izraz neosetljivim na velika i mala slova (na primer **/aBc/i** bi odgovaralo **AbC**) \\ |
| |
====== Intermediate topics ====== | ====== Međuteme ====== |
| |
===== Grouping and capturing — () ===== | ===== Grupisanje i hvatanje — () ===== |
| |
''a(bc)'' parentheses create a //capturing group// with value **bc** \\ | Zagrade ''a(bc)'' stvaraju //grupu za snimanje// sa vrednošću **bc** \\ |
''a(?:bc)*****'' using ''?:'' we disable the capturing group **bc** \\ | ''a(?:bc)*****'' koristeći ''?:'' onemogućavamo grupu za snimanje **bc** \\ |
''a(?<foo>bc)'' using ''?<foo>'' we put a name to the group **bc** \\ | ''a(?<foo>bc)'' koristeći ''?<foo>'' dali smo ime grupi **bc** \\ |
| |
This operator is very useful when we need to extract information from strings or data using your preferred programming language. Any multiple occurrences captured by several groups will be exposed in the form of a classical array: we will access their values specifying using an index on the result of the match. | 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. |
| |
If we choose to put a name to the groups (using ''(?<foo>…)'') we will be able to retrieve the group values using the match result like a dictionary where the keys will be the name of each group. | 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 . |
| |
===== Bracket expressions — [] ===== | ===== Izrazi zagrade — [] ===== |
| |
''[abc]'' matches a string that has **either an a or a b or a c** is the **same as a|b|c ** \\ | ''[abc]'' podudara se sa nizom koji ima **ili a ili b ili c** koje je **isto kao a|b|c ** \\ |
''[a-c]'' same as previous \\ | ''[a-c]'' isto kao i prethodni \\ |
''[a-fA-F0-9]'' a string that represents **a single hexadecimal digit, case insensitively** \\ | ''[a-fA-F0-9]'' niz koji predstavlja **jednu heksadecimalnu cifru, bez obzira na velika i mala slova** \\ |
''[0-9]%'' a string that has a character **from 0 to 9 before a % sign** \\ | ''[0-9]%'' niz koji ima karakter **od 0 do 9 pre znaka %** \\ |
''[^a-zA-Z]'' a string that has not a letter from a to z or from A to Z. In this case the ''^'' is used as **negation of the expression** \\ \\ | ''[^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** \\ \\ |
| |
Remember that inside bracket expressions all special characters (including the backslash ) lose their special powers: thus we will not apply the “escape rule”. | 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“. |
| |
===== Greedy and Lazy match ===== | ===== Pohlepni i lenji se poklapaju ===== |
| |
The quantifiers ( ''* + {}'') are *greedy operators*, so they expand the match as far as they can through the provided text. | Kvantifikatori ( ''* + {}'') su *pohlepni operatori*, tako da proširuju podudaranje koliko god mogu kroz dati tekst. |
| |
For example, ''<.+>'' matches ''<nowiki><div>simple div</div></nowiki>'' in ''This is a <nowiki><div>simple div</div></nowiki>'' test. In order to catch only the ''div'' tag we can use a ''?'' to make it lazy \\ | Na primer, ''<.+>'' odgovara ''<nowiki><div>simple div</div></nowiki>'' u ''This is a <nowiki><div>simple div</div></nowiki>'' test. Da bismo uhvatili samo oznaku ''div'', možemo koristiti ''?'' da je učinimo lenjim \\ |
''<.+?>'' matches any character **one or more** times included inside ''<'' and ''>'', **expanding as needed**. \\ | ''<.+?>'' podudara se sa bilo kojim znakom **jedan ili više** puta uključenim unutar ''<'' i ''>'', **proširujući po potrebi**. \\ |
| |
Notice that a better solution should avoid the usage of ''.'' in favor of a more strict regex: | Primetite da bi bolje rešenje trebalo da izbegava upotrebu ''.'' u korist strožijeg redovnog izraza: |
''<[^<>]+>'' matches any character except ''<'' or ''>'' one or more times included inside ''<'' and ''>''. | ''<[^<>]+>'' odgovara bilo kom znaku osim ''<'' ili ''>'' jednom ili više puta uključenim unutar ''<'' i ''>''. |
| |
---- | ---- |
| |
====== Advanced topics ====== | ====== Napredne teme ====== |
| |
===== Boundaries — b and B ===== | ===== Granice — b i B ===== |
''\babc\b'' performs a **"whole words only"** search \\ \\ | ''\babc\b'' vrši **"samo cele reči"** pretragu \\ \\ |
| |
''\b'' represents an **anchor like caret** (it is similar to ''$'' and ''^'') matching positions where **one side** is a word character (like ''\w'') and the **other side** is not a word character (for instance it may be the beginning of the string or a space character). | ''\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). |
| |
It comes with its **negation**, ''\B''. This matches all positions where ''\b'' doesn’t match and could be if we want to find a search pattern fully surrounded by word characters. | 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'' matches only if the pattern is **fully surrounded** by word characters. | ''\Babc\B'' se podudara samo ako je obrazac **potpuno okružen** znakovima reči. |
| ===== Povratne reference — 1 ===== |
| |
===== Back-references — 1 ===== | ''([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. |
| |
''([abc])\1'' using ''\1'' it matches **the same** text that was matched by the **first capturing group**. \\ | |
''([abc])([de])\2\1'' we can use ''\2'' (3, 4, etc.) to identify **the same** text that **was matched by the second** (third, fourth, etc.) capturing group. \\ | |
''(?<foo>[abc])\k<foo>'' we put the name ''foo'' to the group and we reference it later (''k<foo>''). The result is the same of the first regex. | |
| |
| ===== Pogled napred i pogled iza — (?=) i (?<=) ===== |
| ''d(?=r)'' odudara se sa „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. \\ |
| |
===== Look-ahead and Look-behind — (?=) and (?<=) ===== | Možete koristiti i operator negacije! |
''d(?=r)'' matches a ''d'' only if it is **followed by r**, but ''r'' will not be part of the overall regex match. \\ | |
''(?<=r)d'' matches a ''d'' only if it is **preceded by an r**, but r will not be part of the overall regex match. \\ | |
| |
You can use also the negation operator! | |
| |
''d(?!r)'' matches a ''d'' only if is **not followed by r**, but r will not be part of the overall regex match. \\ | |
''(?<!r)d'' matches a ''d'' only if is **not preceded by an r**, but r will not be part of the overall regex match. | |
| |
| ''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. |