From b3789f2e40df944e8b74de70b029dd813d0f9f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Munk=C3=A1csi=20M=C3=A1rk?= Date: Tue, 24 Oct 2017 23:00:12 +0200 Subject: [PATCH] hungarian translation added for proofreading --- README-hu.md | 877 ++++++++++++++++++++++++++++++++++++++++++++++ img/regexp-hu.png | Bin 0 -> 35766 bytes 2 files changed, 877 insertions(+) create mode 100644 img/regexp-hu.png diff --git a/README-hu.md b/README-hu.md index e69de29..a0e08a2 100644 --- a/README-hu.md +++ b/README-hu.md @@ -0,0 +1,877 @@ +
+

+Learn Regex +


+ +## Translations: +## Fordítások: + +* [English](README.md) +* [Español](README-es.md) +* [Français](README-fr.md) +* [Português do Brasil](README-pt_BR.md) +* [中文版](README-cn.md) +* [日本語](README-ja.md) +* [한국어](README-ko.md) +* [Turkish](README-tr.md) +* [Greek](README-gr.md) +* [Magyar](README-hu.md) + +## What is Regular Expression? +## Mi az a reguláris kifejezés? + +> Regular expression is a group of characters or symbols which is used to find a specific pattern from a text. +> A reguláris kifejezés karakterek vagy szimbólumok egy csoportja, amelyet egy szövegből adott minták megtalálására használnak. + +A regular expression is a pattern that is matched against a subject string from +left to right. The word "Regular expression" is a mouthful, you will usually +find the term abbreviated as "regex" or "regexp". Regular expression is used for +replacing a text within a string, validating form, extract a substring from a +string based upon a pattern match, and so much more. + +A reguláris kifejezés egy olyan minta, amely illeszkedik egy adott karakterláncra +balról jobbra. Maga a "Regular expression" kifejezést általában rövidítve lehet +megtalálni, mint "regex" vagy "regexp". A reguláris kifejezést használják szövegrészek +lecserélésére egy szövegben, űrlapok validálására, szövegrészek kiválasztására +mintaegyezés alapján egy hosszabb szövegből és így tovább. + +Imagine you are writing an application and you want to set the rules for when a +user chooses their username. We want to allow the username to contain letters, +numbers, underscores and hyphens. We also want to limit the number of characters +in username so it does not look ugly. We use the following regular expression to +validate a username: + +Képzeld el, hogy egy alkalmazást írsz és szeretnél szabályokat állítani a felhasználónév +kiválasztásához. A felhasználónév csak betűket, számokat, aláhúzásjelet és kötőjelet +tartalmazhat. Szeretnénk limitálni a karakterek maximális számát is a felhasználónévben, +hogy ne legyen csúnya. A felhasználónév validálására a következő reguláris kifejezést +használjuk: + +

+

+ Regular expression + Regular expression +

+ +Above regular expression can accept the strings `john_doe`, `jo-hn_doe` and +`john12_as`. It does not match `Jo` because that string contains uppercase +letter and also it is too short. + +A feljebbi reguláris kifejezés elfogadja a `john_doe`, `jo-hn_doe` és a +`john12_as` karakterláncokat. Nem fog egyezni a `Jo`-ra mert ez nagybetűt +tartalmaz és túl rövid is. + +## Table of Contents +## Tartalomjegyzék + +- [Basic Matchers](#1-basic-matchers) +- [Meta character](#2-meta-characters) + - [Full stop](#21-full-stop) + - [Character set](#22-character-set) + - [Negated character set](#221-negated-character-set) + - [Repetitions](#23-repetitions) + - [The Star](#231-the-star) + - [The Plus](#232-the-plus) + - [The Question Mark](#233-the-question-mark) + - [Braces](#24-braces) + - [Character Group](#25-character-group) + - [Alternation](#26-alternation) + - [Escaping special character](#27-escaping-special-character) + - [Anchors](#28-anchors) + - [Caret](#281-caret) + - [Dollar](#282-dollar) +- [Shorthand Character Sets](#3-shorthand-character-sets) +- [Lookaround](#4-lookaround) + - [Positive Lookahead](#41-positive-lookahead) + - [Negative Lookahead](#42-negative-lookahead) + - [Positive Lookbehind](#43-positive-lookbehind) + - [Negative Lookbehind](#44-negative-lookbehind) +- [Flags](#5-flags) + - [Case Insensitive](#51-case-insensitive) + - [Global search](#52-global-search) + - [Multiline](#53-multiline) + +- [Bevezetés](#1-basic-matchers) +- [Meta karakterek](#2-meta-characters) + - [Full stop](#21-full-stop) + - [Karakter osztályok](#22-character-set) + - [Negált karakter osztályok](#221-negated-character-set) + - [Ismétlések](#23-repetitions) + - [A csillag](#231-the-star) + - [A plusz](#232-the-plus) + - [A kérdőjel](#233-the-question-mark) + - [A kapcsos zárójelek](#24-braces) + - [Karakter csoportok](#25-character-group) + - [Alternálás](#26-alternation) + - [Speciális karakter escape-elése](#27-escaping-special-character) + - [Horgonyok](#28-anchors) + - [Kalap](#281-caret) + - [Dollár](#282-dollar) +- [Shorthand Karakter osztályok](#3-shorthand-character-sets) +- [Lookaround](#4-lookaround) + - [Positive Lookahead](#41-positive-lookahead) + - [Negative Lookahead](#42-negative-lookahead) + - [Positive Lookbehind](#43-positive-lookbehind) + - [Negative Lookbehind](#44-negative-lookbehind) +- [Flag-ek](#5-flags) + - [Kis-nagybetű érzéketlen](#51-case-insensitive) + - [Globális keresés](#52-global-search) + - [Többsoros](#53-multiline) + +## 1. Basic Matchers +## 1. Bevezetés + +A regular expression is just a pattern of characters that we use to perform +search in a text. For example, the regular expression `the` means: the letter +`t`, followed by the letter `h`, followed by the letter `e`. + +A reguláris kifejezés egy karakterminta, amit keresésre használunk egy +szövegben. Például a `the` reguláris kifejezés a következőt jelenti: egy `t` betű, +amit `h` követ, amit egy `e` követ. + +
+"the" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/dmRygT/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/dmRygT/1) + +The regular expression `123` matches the string `123`. The regular expression is +matched against an input string by comparing each character in the regular +expression to each character in the input string, one after another. Regular +expressions are normally case-sensitive so the regular expression `The` would +not match the string `the`. + +Az `123` reguláris kifejezés illeszkedik a `123` karakterláncra. A reguláris kifejezés +minden egyes karaktere össze lesz hasonlítva a bevitt karakterlánc minden elemével +egymás után. A reguláris kifejezések alap esetben kis-nagybetű érzékenyek, tehát a +`The` reguláris kifejezés nem fog illeszkedni a `the` karakterláncra. + +
+"The" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/1paXsy/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/1paXsy/1) + +## 2. Meta Characters +## 2. Meta karakterek + +Meta characters are the building blocks of the regular expressions. Meta +characters do not stand for themselves but instead are interpreted in some +special way. Some meta characters have a special meaning and are written inside +square brackets. The meta characters are as follows: + +A meta karakterek a reguláris kifejezések építőkockái. A meta karakterek speciális +módon értelmezendőek. Némelyik meta karakternek speciális jelentése van és +szögletes zárójelek közé vannak téve. A meta karakterek a következők: + +|Meta character|Description| +|:----:|----| +|.|Period matches any single character except a line break.| +|[ ]|Character class. Matches any character contained between the square brackets.| +|[^ ]|Negated character class. Matches any character that is not contained between the square brackets| +|*|Matches 0 or more repetitions of the preceding symbol.| +|+|Matches 1 or more repetitions of the preceding symbol.| +|?|Makes the preceding symbol optional.| +|{n,m}|Braces. Matches at least "n" but not more than "m" repetitions of the preceding symbol.| +|(xyz)|Character group. Matches the characters xyz in that exact order.| +|||Alternation. Matches either the characters before or the characters after the symbol.| +|\|Escapes the next character. This allows you to match reserved characters [ ] ( ) { } . * + ? ^ $ \ || +|^|Matches the beginning of the input.| +|$|Matches the end of the input.| + +|Meta karakter|Leírás| +|:----:|----| +|.|A pont illeszkedik minden egyes karakterre kivéve a sortörést.| +|[ ]|Karakter osztály. Minden karakterre illeszkedik ami a szögletes zárójelek közt van.| +|[^ ]|Negált karakter osztály. Minden karakterre illeszkedik ami nincs a szögletes zárójelek közt.| +|*|Illeszkedik az őt megelőző szimbólum 0 vagy több ismétlődésére.| +|+|Illeszkedik az őt megelőző szimbólum 1 vagy több ismétlődésére.| +|?|Opcionálissá teszi az őt megelőző szimbólumot.| +|{n,m}|Kapcsos zárójelek. Illeszkedik az őt megelőző szimbólum minimum "n" de nem több mint "m" ismétlődésére.| +|(xyz)|Karakter csoport. Illeszkedik az xyz karakterekre pontosan ilyen sorrendben.| +|||Alternáció. Illeszkedik a szimbólum előtt és után álló karakterekre is.| +|\|Escape-li a következő karaktert. A segítségével lefoglalt karakterekre is lehet illeszkedni [ ] ( ) { } . * + ? ^ $ \ || +|^|A bevitel elejére illeszkedik.| +|$|A bevitel végére illeszkedik.| + +## 2.1 Full stop +## 2.1 Full stop + +Full stop `.` is the simplest example of meta character. The meta character `.` +matches any single character. It will not match return or newline characters. +For example, the regular expression `.ar` means: any character, followed by the +letter `a`, followed by the letter `r`. + +A full stop `.` a legegyszerűbb meta karakter példa. A `.` meta karakter illeszkedik +minden egyes karakterre. Nem fog illeszkedni a kocsi vissza és a sortörés karakterekre. +Például a `.ar` reguláris kifejezés jelentése: minden karakter, amit `a` aztán `r` követ. + +
+".ar" => The car parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/xc9GkU/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/xc9GkU/1) + +## 2.2 Character set +## 2.2 Karakter osztályok + +Character sets are also called character class. Square brackets are used to +specify character sets. Use a hyphen inside a character set to specify the +characters' range. The order of the character range inside square brackets +doesn't matter. For example, the regular expression `[Tt]he` means: an uppercase +`T` or lowercase `t`, followed by the letter `h`, followed by the letter `e`. + +A szögletes zárójelekkel határozzuk meg a karakter osztályokat. A szögletes +zárójelek közt kötőjel karakterrel határozhatunk meg karakter tartományokat. +A karaktertartomány sorrendje nem számít. Például a `[Tt]he` reguláris kifejezés +jelentése: nagybetűs `T` vagy kisbetűs `t` amit egy `h` majd egy `e` betű követ. + +
+"[Tt]he" => The car parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/2ITLQ4/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/2ITLQ4/1) + +A period inside a character set, however, means a literal period. The regular +expression `ar[.]` means: a lowercase character `a`, followed by letter `r`, +followed by a period `.` character. + +Egy pont a karakter osztályon belül egyébként szó szerint pont-ot jelent. A +`ar[.]` reguláris kifejezés jelentése: kisbetűs `a` amit egy `r` aztán egy +pont `.` karakter követ. + +
+"ar[.]" => A garage is a good place to park a car.
+
+ +[Test the regular expression](https://regex101.com/r/wL3xtE/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 Negated character set +### 2.2.1 Negált karakter osztályok + +In general, the caret symbol represents the start of the string, but when it is +typed after the opening square bracket it negates the character set. For +example, the regular expression `[^c]ar` means: any character except `c`, +followed by the character `a`, followed by the letter `r`. + +Általában a kalap szimbólum egy karakterlánc elejét jelenti, de ha egy nyitó +szögletes zárójel után áll, akkor negálja a karakter osztályt. Például a +`[^c]ar` reguláris kifejezés jelentése: minden karakter a `c` kivételével +ami után `a` aztán egy `r` betű áll. + +
+"[^c]ar" => The car parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/nNNlq3/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/nNNlq3/1) + +## 2.3 Repetitions +## 2.3 Ismétlések + +Following meta characters `+`, `*` or `?` are used to specify how many times a +subpattern can occur. These meta characters act differently in different +situations. + +A következő meta karaktereket `+`, `*` vagy `?` arra használjuk, hogy meghatározzuk, +hányszor fordulhat elő az al-minta. Ezek a meta karakterek máshogy viselkednek +adott helyzetekben. + +### 2.3.1 The Star +### 2.3.1 A csillag + +The symbol `*` matches zero or more repetitions of the preceding matcher. The +regular expression `a*` means: zero or more repetitions of preceding lowercase +character `a`. But if it appears after a character set or class then it finds +the repetitions of the whole character set. For example, the regular expression +`[a-z]*` means: any number of lowercase letters in a row. + +A `*` szimbólum az őt megelőző karakter nulla vagy több ismétlődésére illeszkedik. +A `a*` reguláris kifejezés jelentése: nulla vagy több ismétlődése az őt megelőző `a` +karakternek. De ha egy karakter osztály után áll akkor az egész karakterosztály +ismétlődését keresi. Például, a `[a-z]*` reguláris kifejezés jelentése: bármennyi +kisbetűs betű egy sorban. + +
+"[a-z]*" => The car parked in the garage #21.
+
+ +[Test the regular expression](https://regex101.com/r/7m8me5/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/7m8me5/1) + +The `*` symbol can be used with the meta character `.` to match any string of +characters `.*`. The `*` symbol can be used with the whitespace character `\s` +to match a string of whitespace characters. For example, the expression +`\s*cat\s*` means: zero or more spaces, followed by lowercase character `c`, +followed by lowercase character `a`, followed by lowercase character `t`, +followed by zero or more spaces. + +A `*` szimbólum használható a `.` meta karakterrel `.*`, ez illeszkedik +bármilyen karakterláncra. A `*` szimbólum használható a whitespace karakterrel `\s` +együtt, hogy illeszkedjen egy whitespace-ekből álló karakterláncra. Például a +`\s*cat\s*`kifejezés jelentése: nulla vagy több szóköz, amit egy kisbetűs `c`, +aztán egy kisbetűs `a`, aztán egy kisbetűs `t`, amit még nulla vagy több szóköz követ. + +
+"\s*cat\s*" => The fat cat sat on the concatenation.
+
+ +[Test the regular expression](https://regex101.com/r/gGrwuz/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 The Plus +### 2.3.2 A plusz + +The symbol `+` matches one or more repetitions of the preceding character. For +example, the regular expression `c.+t` means: lowercase letter `c`, followed by +at least one character, followed by the lowercase character `t`. It needs to be +clarified that `t` is the last `t` in the sentence. + +A `+` szimbólum illeszkedik az őt megelőző karakter egy vagy több ismétlődésére. +Például a `c.+t` kifejezés jelentése: kisbetűs `c` betű, amit legalább egy vagy +több `t` követ. Itt tisztázni kell hogy a `t` az utolsó `t` a mondatban. + +
+"c.+t" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/Dzf9Aa/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 The Question Mark +### 2.3.3 A kérdőjel + +In regular expression the meta character `?` makes the preceding character +optional. This symbol matches zero or one instance of the preceding character. +For example, the regular expression `[T]?he` means: Optional the uppercase +letter `T`, followed by the lowercase character `h`, followed by the lowercase +character `e`. + +A reguláris kifejezésben a `?` meta karakter opcionálissá teszi az őt +megelőző karaktert. Ez a szimbólum az őt megelőző karakter nulla vagy egy +példányára illeszkedik. Például a `[T]?he` kifejezés jelentése: opcionális a +nagybetűs `T`, amit egy kisbetűs `h`, majd egy kisbetűs `e` követ. + +
+"[T]he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/cIg9zm/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/cIg9zm/1) + +
+"[T]?he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/kPpO2x/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/kPpO2x/1) + +## 2.4 Braces +## 2.4 A kapcsos zárójelek + +In regular expression braces that are also called quantifiers are used to +specify the number of times that a character or a group of characters can be +repeated. For example, the regular expression `[0-9]{2,3}` means: Match at least +2 digits but not more than 3 ( characters in the range of 0 to 9). + +A reguláris kifejezésben a kapcsos zárójeleket annak meghatározására használjuk, +hogy egy karakter vagy egy karakter csoport hányszor ismétlődhet. Például a +`[0-9]{2,3}` kifejezés jelentése: minimum 2 de nem több mint 3 karakter a `[0-9]` +karaktertartományon belül. + +
+"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Test the regular expression](https://regex101.com/r/juM86s/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/juM86s/1) + +We can leave out the second number. For example, the regular expression +`[0-9]{2,}` means: Match 2 or more digits. If we also remove the comma the +regular expression `[0-9]{3}` means: Match exactly 3 digits. + +Kihagyhatjuk a második számot. Például a `[0-9]{2,}` kifejezés jelentése: +2 vagy több számra illeszkedik. Ha a vesszőt is kitöröljük `[0-9]{3}`: Pontosan +3 számra illeszkedik. + +
+"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Test the regular expression](https://regex101.com/r/Gdy4w5/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/Gdy4w5/1) + +
+"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Test the regular expression](https://regex101.com/r/Sivu30/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/Sivu30/1) + +## 2.5 Character Group +## 2.5 Karakter csoportok + +Character group is a group of sub-patterns that is written inside Parentheses `(...)`. +As we discussed before that in regular expression if we put a quantifier after a +character then it will repeat the preceding character. But if we put quantifier +after a character group then it repeats the whole character group. For example, +the regular expression `(ab)*` matches zero or more repetitions of the character +"ab". We can also use the alternation `|` meta character inside character group. +For example, the regular expression `(c|g|p)ar` means: lowercase character `c`, +`g` or `p`, followed by character `a`, followed by character `r`. + +A karakter csoport al-minták csoportja amik zárójelek közé `(...)` vannak írva. +Ahogy előbb már megbeszéltük, ha egy karakter után ismétlő karaktert rakunk, az +ismételni fogja az előtte lévő karaktert. De ha egy ismétlő karaktert egy karakter +csoport után rakunk, az ismételni fogja az egész csoportot. Például a `(ab)*` +kifejezés illeszkedik nulla vagy több ismétlődésére az `ab` karaktereknek. +Használhatunk alternáló meta karaktert `|` is a csoporton belül. Például a `(c|g|p)ar` +kifejezés jelentése: kisbetűs `c`, `g` vagy `p` karakter, amit egy `a` aztán +egy `r` karakter követ. + +
+"(c|g|p)ar" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/tUxrBG/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/tUxrBG/1) + +## 2.6 Alternation +## 2.6 Alternálás + +In regular expression Vertical bar `|` is used to define alternation. +Alternation is like a condition between multiple expressions. Now, you may be +thinking that character set and alternation works the same way. But the big +difference between character set and alternation is that character set works on +character level but alternation works on expression level. For example, the +regular expression `(T|t)he|car` means: uppercase character `T` or lowercase +`t`, followed by lowercase character `h`, followed by lowercase character `e` or +lowercase character `c`, followed by lowercase character `a`, followed by +lowercase character `r`. + +A reguláris kifejezésben a függőleges vonalat `|` alternálásra (választásra) +használjuk. Az alternálás olyan, mint egy feltétel több kifejezés közt. Most +azt gondolhatod, hogy a karakter osztály és az alternáció ugyan úgy működik. +De a fő különbség köztük, hogy a karakter osztály a karakterek szintjén működik, +az alternáció viszont a kifejezés szintjén. Például a `(T|t)he|car` kifejezés +jelentése: nagybetűs `T` karakter vagy kisbetűs `t` karakter, amit egy `h` és +egy `e` követ, VAGY kisbetűs `c` aztán `a` aztán `r` karakter. + +
+"(T|t)he|car" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/fBXyX0/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/fBXyX0/1) + +## 2.7 Escaping special character +## 2.7 Speciális karakter escape-elése + +Backslash `\` is used in regular expression to escape the next character. This +allows us to specify a symbol as a matching character including reserved +characters `{ } [ ] / \ + * . $ ^ | ?`. To use a special character as a matching +character prepend `\` before it. + +A visszaper `\` a reguláris kifejezésekben a következő karakter escape-elésére +való. Ez enged nekünk szimbólumokat vagy lefoglalt karaktereket `{ } [ ] / \ + * . $ ^ | ?` +megadni. Egy speciális karakter egyező karakterként való megadásához tedd elé +a `\` karaktert. + +For example, the regular expression `.` is used to match any character except +newline. Now to match `.` in an input string the regular expression +`(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by lowercase +character `a`, followed by lowercase letter `t`, followed by optional `.` +character. + +Például a `.` kifejezést az összes karakter, kivéve a sortörés illeszkedéséhez +használjuk. A `(f|c|m)at\.?` kifejezés jelentése: kisbetűs `f`, `c` vagy `m`, amit +egy kisbetűs `a` aztán egy kisbetűs `t`, amit egy opcionális `.` karakter követ. + +
+"(f|c|m)at\.?" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/DOc5Nu/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/fBXyX0/1) + +## 2.8 Anchors +## 2.8 Horgonyok + +In regular expressions, we use anchors to check if the matching symbol is the +starting symbol or ending symbol of the input string. Anchors are of two types: +First type is Caret `^` that check if the matching character is the start +character of the input and the second type is Dollar `$` that checks if matching +character is the last character of the input string. + +A reguláris kifejezésekben horgonyokat használunk, hogy megnézzük, az illeszkedő +szimbólum a kezdő vagy a záró szimbóluma-e a karakterláncnak. A horgonyoknak két +fajtájuk van: Az első a Kalap `^`, ami megnézi, hogy az egyező karakter a karakterlánc +kezdő kerektere-e és a második a Dollár `$`, ami azt vizsgálja, hogy az egyező +karakter a karakterlánc utolsó karaktere-e. + +### 2.8.1 Caret +### 2.8.1 Kalap + +Caret `^` symbol is used to check if matching character is the first character +of the input string. If we apply the following regular expression `^a` (if a is +the starting symbol) to input string `abc` it matches `a`. But if we apply +regular expression `^b` on above input string it does not match anything. +Because in input string `abc` "b" is not the starting symbol. Let's take a look +at another regular expression `^(T|t)he` which means: uppercase character `T` or +lowercase character `t` is the start symbol of the input string, followed by +lowercase character `h`, followed by lowercase character `e`. + +A kalap `^` szimbólumot arra használjuk, hogy megnézzük, hogy az egyező karakter +a karakterlánc kezdő kerektere-e. Ha megadjuk a következő kifejezést: `^a`, +akkor illeszkedik a `abc` karakterlánc `a` karakterére, mert az za első. De ha +megadjuk, hogy: `^b`, ez nem fog illeszkedni az `abc` egyik részére sem, mert +nem `b` a kezdő karakter. Nézzünk meg egy másik kifejezést. `^(T|t)he` jelentése: +nagybetűs `T` vagy kisbetűs `t` a kezdő karaktere a karakterláncnak, amit kisbetűs +`h`, majd kisbetűs `e` követ. + +
+"(T|t)he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/5ljjgB/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/5ljjgB/1) + +
+"^(T|t)he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/jXrKne/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/jXrKne/1) + +### 2.8.2 Dollar +### 2.8.2 Dollár + +Dollar `$` symbol is used to check if matching character is the last character +of the input string. For example, regular expression `(at\.)$` means: a +lowercase character `a`, followed by lowercase character `t`, followed by a `.` +character and the matcher must be end of the string. + +A dollár `$` szimbólumot arra használjuk, hogy megnézzük, hogy az egyező +karakter a karakterlánc utolsó karaktere-e. Például a `(at\.)$` kifejezés +jelentése: egy kisbetűs `a`, amit egy kisbetűs `t`, amit egy `.` követ. És +ennek az egésznek a karakterlánc végén kell lennie. + +
+"(at\.)" => The fat cat. sat. on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/y4Au4D/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/y4Au4D/1) + +
+"(at\.)$" => The fat cat. sat. on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/t0AkOd/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/t0AkOd/1) + +## 3. Shorthand Character Sets +## 3. Shorthand Karakter osztályok + +Regular expression provides shorthands for the commonly used character sets, +which offer convenient shorthands for commonly used regular expressions. The +shorthand character sets are as follows: + +A gyakran használt karakter osztályokra a reguláris kifejezésnek vannak +rövidítései, amikkel kényelmesebben tudunk használni általános kifejezéseket. +A shorthand karakter osztályok a következők: + +|Shorthand|Description| +|:----:|----| +|.|Any character except new line| +|\w|Matches alphanumeric characters: `[a-zA-Z0-9_]`| +|\W|Matches non-alphanumeric characters: `[^\w]`| +|\d|Matches digit: `[0-9]`| +|\D|Matches non-digit: `[^\d]`| +|\s|Matches whitespace character: `[\t\n\f\r\p{Z}]`| +|\S|Matches non-whitespace character: `[^\s]`| + +|Rövidítés|Leírás| +|:----:|----| +|.|Minden karakter a sortörésen kívül.| +|\w|Az alfanumerikus karakterekre illeszkedik: `[a-zA-Z0-9_]`| +|\W|A nem alfanumerikus karakterekre illeszkedik: `[^\w]`| +|\d|Számra illeszkedik: `[0-9]`| +|\D|Nem számra illeszkedik: `[^\d]`| +|\s|Whitespace karakterre illeszkedik: `[\t\n\f\r\p{Z}]`| +|\S|Nem whitespace karakterre illeszkedik: `[^\s]`| + +## 4. Lookaround +## 4. Lookaround + +Lookbehind and lookahead (also called lookaround) are specific types of +***non-capturing groups*** (Used to match the pattern but not included in matching +list). Lookaheads are used when we have the condition that this pattern is +preceded or followed by another certain pattern. For example, we want to get all +numbers that are preceded by `$` character from the following input string +`$4.44 and $10.88`. We will use following regular expression `(?<=\$)[0-9\.]*` +which means: get all the numbers which contain `.` character and are preceded +by `$` character. Following are the lookarounds that are used in regular +expressions: + +A lookbehind (hátranézés) és a lookahead (előrenézés) speciális típusai a +***nem tárolt csoport***oknak, amiket illeszkedésre használnak, de nincsenek +benne az illeszkedési listában. Az előrenézést akkor használjuk, ha feltételezzük, +hogy ezt a mintát egy másik minta előzi meg, vagy követi. Például kell nekünk +az összes szám ami előtt `$` karakter áll a következő karakterláncból: `$4.44 and $10.88`. +Ezt a mintát fogjuk használni: `(?<=\$)[0-9\.]*`, aminek a jelentése: Szedd ki az +összes számot ami `.` karaktert tartalmaz és megelőzi egy `$` karakter. A +következő lookaround-okat használhatjuk: + +|Symbol|Description| +|:----:|----| +|?=|Positive Lookahead| +|?!|Negative Lookahead| +|?<=|Positive Lookbehind| +|? +"(T|t)he(?=\sfat)" => The fat cat sat on the mat. + + +[Test the regular expression](https://regex101.com/r/IDDARt/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/IDDARt/1) + +### 4.2 Negative Lookahead +### 4.2 Negative Lookahead + +Negative lookahead is used when we need to get all matches from input string +that are not followed by a pattern. Negative lookahead is defined same as we define +positive lookahead but the only difference is instead of equal `=` character we +use negation `!` character i.e. `(?!...)`. Let's take a look at the following +regular expression `(T|t)he(?!\sfat)` which means: get all `The` or `the` words +from input string that are not followed by the word `fat` precedes by a space +character. + +A negatív előrenézést akkor használjuk, ha az olyan illeszkedések kellenek, +amelyeket nem követ egy bizonyos minta. A negatív előrenézést ugyanúgy +definiáljuk mint a pozitív előrenézést, az egyetlen különbség, hogy az +egyenlőségjel `=` helyett negálást `!` használunk: `(?!...)`. Nézzük meg +a következő kifejezést: `(T|t)he(?!\sfat)`, jelentése: szedd ki az összes +`The` vagy `the` szót, amelyeket nem követ a `fat` szó (amit még megelőz +egy szóköz). + +
+"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/V32Npg/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/V32Npg/1) + +### 4.3 Positive Lookbehind +### 4.3 Positive Lookbehind + +Positive lookbehind is used to get all the matches that are preceded by a +specific pattern. Positive lookbehind is denoted by `(?<=...)`. For example, the +regular expression `(?<=(T|t)he\s)(fat|mat)` means: get all `fat` or `mat` words +from input string that are after the word `The` or `the`. + +A pozitív hátranézést akkor használjuk, ha kell az összes illeszkedés, amit +egy megadott minta előz meg. A pozitív hátranézés így van jelölve: `(?<=...)`. +A `(?<=(T|t)he\s)(fat|mat)` jelentése: szedd ki az összes `fat` vagy `mat` szót +amelyek a `The` vagy a `the` szavak után vannak. + +
+"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/avH165/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/avH165/1) + +### 4.4 Negative Lookbehind +### 4.4 Negative Lookbehind + +Negative lookbehind is used to get all the matches that are not preceded by a +specific pattern. Negative lookbehind is denoted by `(? +"(?<!(T|t)he\s)(cat)" => The cat sat on cat. + + +[Test the regular expression](https://regex101.com/r/8Efx5G/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/8Efx5G/1) + +## 5. Flags +## 5. Flag-ek + +Flags are also called modifiers because they modify the output of a regular +expression. These flags can be used in any order or combination, and are an +integral part of the RegExp. + +A flag-eket módosítónak hívják, mert módosítják a reguláris kifejezés +kimenetét. Ezeket a flag-eket bármilyen sorban vagy kombinációban lehet +használni, a RegExp szerves részét képezik. + +|Flag|Description| +|:----:|----| +|i|Case insensitive: Sets matching to be case-insensitive.| +|g|Global Search: Search for a pattern throughout the input string.| +|m|Multiline: Anchor meta character works on each line.| + +|Flag|Leírás| +|:----:|----| +|i|Kis-nagybetű érzéketlen: Beállítja, hogy az illeszkedés kis-nagybetű érzéketlen legyen.| +|g|Globális keresés: A bemeneti szövegben mindenütt keresi az illeszkedéseket.| +|m|Többsoros: A horgonyok az összes sorra működnek.| + +### 5.1 Case Insensitive +### 5.1 Kis-nagybetű érzéketlen + +The `i` modifier is used to perform case-insensitive matching. For example, the +regular expression `/The/gi` means: uppercase letter `T`, followed by lowercase +character `h`, followed by character `e`. And at the end of regular expression +the `i` flag tells the regular expression engine to ignore the case. As you can +see we also provided `g` flag because we want to search for the pattern in the +whole input string. + +Az `i` módosító beállítja, hogy az illeszkedés ne legyen kis-nagybetű érzékeny. +Például a `/The/gi` kifejezés jelentése: nagybetűs `T` amit kisbetűs `h`, majd `e` +követ. A kifejezés végén az `i` megmondja a reguláris kifejezés motornak, hogy +hagyja figyelmen kívül a betűk méretét. Ahogy látod, megadtuk a `g` flag-et, mert +az egész bemeneti szövegben akarjuk keresni az illeszkedéseket. + +
+"The" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/dpQyf9/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/dpQyf9/1) + +
+"/The/gi" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/ahfiuh/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/ahfiuh/1) + +### 5.2 Global search +### 5.2 Globális keresés + +The `g` modifier is used to perform a global match (find all matches rather than +stopping after the first match). For example, the regular expression`/.(at)/g` +means: any character except new line, followed by lowercase character `a`, +followed by lowercase character `t`. Because we provided `g` flag at the end of +the regular expression now it will find all matches in the input string, not just the first one (which is the default behavior). + +A `g` módosítót arra használjuk, hogy globálisan keressünk illeszkedéseket. +(Megkeresi az összes előfordulást, nem áll meg az első egyezés után). Például +a `/.(at)/g` kifejezés jelentése: minden karakter, kivéve a sortörést, amelyet +`a` és `t` követ. Mivel megadtuk a `g` flag-et, az összes ilyenre fog illeszkedni, +nem csak az elsőre (ami az alapértelmezett viselkedés). + +
+"/.(at)/" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/jnk6gM/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/jnk6gM/1) + +
+"/.(at)/g" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/dO1nef/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/dO1nef/1) + +### 5.3 Multiline +### 5.3 Többsoros + +The `m` modifier is used to perform a multi-line match. As we discussed earlier +anchors `(^, $)` are used to check if pattern is the beginning of the input or +end of the input string. But if we want that anchors works on each line we use +`m` flag. For example, the regular expression `/at(.)?$/gm` means: lowercase +character `a`, followed by lowercase character `t`, optionally anything except +new line. And because of `m` flag now regular expression engine matches pattern +at the end of each line in a string. + +Az `m` módosítót a többsoros illeszkedésekhez használjuk. Ahogy előzőleg beszéltük, +a horgonyokat `(^, $)` arra használjuk, hogy megnézzük, a minta az eleje, vagy a vége-e +a vizsgált karakterláncnak. De ha azt szeretnénk, hogy a horgonyok az összes soron +működjenek, használjuk az `m` módosítót. Például a `/at(.)?$/gm` kifejezés jelentése: +kisbetűs `a` karakter, amit egy kisbetűs `t` követ, amit opcionálisan bármi követhet, +kivéve sortörés. És az `m` flag miatt a reguláris kifejezés motor az összes sor +végéig keres illeszkedést. + +
+"/.at(.)?$/" => The fat
+                cat sat
+                on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/hoGMkP/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/hoGMkP/1) + +
+"/.at(.)?$/gm" => The fat
+                  cat sat
+                  on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/E88WE2/1) +[Teszteld a reguláris kifejezést](https://regex101.com/r/E88WE2/1) + +## Contribution +## Hozzájárulás + +* Report issues +* Open pull request with improvements +* Spread the word +* Reach out to me directly at ziishaned@gmail.com or [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +* Jelents hibákat +* Nyiss pull request-eket fejlesztésekkel +* Hírdesd az igét +* Érj el közvetlenül itt: ziishaned@gmail.com vagy [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## License +## Licenc + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/img/regexp-hu.png b/img/regexp-hu.png new file mode 100644 index 0000000000000000000000000000000000000000..70d1f516881f7a93647beb8fb680df08c95c235f GIT binary patch literal 35766 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 literal 0 HcmV?d00001