First commit

This commit is contained in:
MariaBat 2017-09-07 22:15:34 +03:00
parent 591de7b192
commit 67afd0d5a3

552
README-gr.md Normal file
View File

@ -0,0 +1,552 @@
<br/>
<p align="center">
<img src="https://i.imgur.com/bYwl7Vf.png" alt="Learn Regex">
</p><br/>
## Μεταφράσεις:
* [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)
## Τι είναι μια Κανονική Έκφραση (Regular Expression);
> Μια κανονική έκφραση είναι μια ομάδα χαρακτήρων ή συμβόλων που χρησιμοποιούνται για την εύρεση ενός συγκεκριμένου μοτίβου μέσα σ'ένα κείμενο.
Μια κανονική έκφραση είναι ένα μοτίβο το οποίο συγκρίνεται με ένα string από
τα αριστερά προς τα δεξιά. Ο όρος "Κανονική Έκφραση" είναι κάπως μεγάλος οπότε πολύ συχνά
θα τον συναντήσετε στην συντομότερη μορφή του ως "regex" ή "regexp". Οι κανονικές εκφράσεις χρησιμοποιούνται
για αντικατάσταση κειμένου μέσα σε string, για επικυρώσεις τύπων, για αποκοπή κομματιού ενός
string με βάση κάποιου μοτίβου σύγκρισης και για πολλά άλλα.
Φανταστείτε ότι πρέπει να γράψετε μια εφαρμογή και ότι θέλετε να ορίσετε κανόνες για την περίπτωση που
ο χρήστης επιλέγει το username του. Θέλουμε να επιτρέψουμε την χρήση γραμμάτων,
αριθμών καθώς και την παύλα και κάτω παύλα. Θέλουμε επίσης να περιορίσουμε τον αριθμό χαρακτήρων
του username ώστε να μην φαίνεται άσχημο. Για να το κάνουμε αυτό, χρησιμοποιούμε την παρακάτω κανονική
έκφραση:
<br/><br/>
<p align="center">
<img src="./img/regexp-en.png" alt="Regular expression">
</p>
Η παραπάνω κανονική έκφραση θα δεχτεί ως σωστά τα strings `john_doe`, `jo-hn_doe` και
`john12_as`. Όμως δεν θα δεχτεί το `Jo` αφού περιέχει κεφαλαίο γράμμα και είναι πολύ
μικρό.
## Πίνακας Περιεχομένων
- [Βασικά Μοτίβα Σύγκρισης](#1-basic-matchers)
- [Μεταχαρακτήρες](#2-meta-characters)
- [Τελεία](#21-full-stop)
- [Σύνολα Χαρακτήρων](#22-character-set)
- [Σύνολο Χαρακτήρων προς Εξαίρεση](#221-negated-character-set)
- [Επαναλήψεις](#23-repetitions)
- [Ο Αστερίσκος](#231-the-star)
- [Το Σύμβολο της Πρόσθεσης](#232-the-plus)
- [Το Ερωτηματικό](#233-the-question-mark)
- [Αγκύλες](#24-braces)
- [Ομάδα Χαρακτήρων](#25-character-group)
- [Εναλλαγή](#26-alternation)
- [Ειδικός Χαρακτήρας Διαφυγής](#27-escaping-special-character)
- [Σύμβολα "Άγκυρες"](#28-anchors)
- [Το Σύμβολο ^](#281-caret)
- [Το Δολάριο](#282-dollar)
- [Συντομογραφίες Συνόλων Χαρακτήρων](#3-shorthand-character-sets)
- [Αναζήτηση](#4-lookaround)
- [Θετική Αναζήτηση προς τα Μπροστά](#41-positive-lookahead)
- [Αρνητική Αναζήτηση προς τα Μπροστά](#42-negative-lookahead)
- [Θετική Αναζήτηση προς τα Πίσω](#43-positive-lookbehind)
- [Αρνητική Αναζήτηση προς τα Πίσω](#44-negative-lookbehind)
- [Σημαίες](#5-flags)
- [Χωρίς Διάκριση Πεζών-Κεφαλαίων](#51-case-insensitive)
- [Καθολική Αναζήτηση](#52-global-search)
- [Πολλές Γραμμές](#53-multiline)
## 1. Βασικά Μοτίβα Σύγκρισης
Μια κανονική έκφραση είναι απλώς ένα μοτίβο χαρακτήρων που χρησιμοποιούμε ώστε να κάνουμε
αναζήτηση σε ένα κείμενο. Για παράδειγμα, η κανονική έκφραση `the` αναπαριστά: το γράμμα
`t`, ακολουθούμενο από το γράμμα `h`, ακολουθούμενο από το γράμμα `e`.
<pre>
"the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/dmRygT/1)
Η κανονική έκφραση `123` "ταιριάζει" με το string `123`. Η κανονική έκφραση
συγκρίνεται με ένα string εισόδου αντιστοιχίζοντας κάθε χαρακτήρα της με κάθε
του string εισόδου, το ένα μετά το άλλο. Οι κανονικές εκφράσεις συνήθως λαμβάνουν
υπόψη τα κεφαλαία ή πεζά γράμματα και άρα η έκφραση `The` δεν θα ταίριαζε με το
string `the`.
<pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/1paXsy/1)
## 2. Μεταχαρακτήρες
Οι μεταχαρακτήρες είναι τα δομικά στοιχεία των κανονικών εκφράσεων. Δεν αντιπροσωπεύουν
τον εαυτό τους αλλά ερμηνεύονται με ειδικό τρόπο. Μερικοί από αυτούς, έχουν
ειδικό νόημα και γράφονται μέσα σε αγκύλες. Οι ματαχαρακτήρες είναι οι παρακάτω:
|Μεταχαρακτήρας|Περιγραφή|
|:----:|----|
|.|Η τελεία ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα εκτός από αυτόν για αλλαγή γραμμής.|
|[ ]|Κλάση χαρακτήρων. Ταιριάζει με οποιονδήποτε χαρακτήρα βρίσκεται μέσα σε αγκύλες.|
|[^ ]|Κλάση χαρακτήρων εξαίρεσης. Ταιριάζει με οποιονδήποτε χαρακτήρα δεν βρίσκεται μέσα σε αγκύλες|
|*|Ταιριάζει με 0 ή παραπάνω επαναλήψεις του προηγούμενου συμβόλου.|
|+|Ταιριάζει με 1 ή παραπάνω επαναλήψεις του προηγούμενου συμβόλου.|
|?|Κάνει το προηγούμενο σύμβολο προαιρετικό.|
|{n,m}|Αγκύλες. Ταιριάζει με τουλάχιστον "n" αλλά όχι με παραπάνω από "m" επαναλήψεις του προηγούμενου συμβόλου.|
|(xyz)|Ομάδα χαρακτήρων. Ταιριάζει με τους χαρακτήρες xyz ακριβώς με την σειρά στην οποία βρίσκονται.|
|&#124;|Εναλλαγή. Ταιριάζει είτε με τους χαρακτήρες που βρίσκονται πριν είτε μετά το σύμβολο.|
|&#92;|Παραλείπει τον επόμενο χαρακτήρα. Αυτό μας επιτρέπει να ταιριάξουμε χαρακτήρες ειδικής χρήσης <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>|
|^|Συγκρίνεται με την αρχή μιας εισόδου.|
|$|Συγκρίνεται με το τέλος μια εισόδου.|
## 2.1 Τελεία
Η τελεία `.` είναι το πιο απλό παράδειγμα μεταχαρακτήρα. Ταιριάζει με οποιονδήποτε
μεμονωμένο χαρακτήρα. Δεν ταιριάζει με τον χαρακτήρα για επιστροφή στην αρχή της γραμμής
ούτε με αυτόν για νέα σειρά. Για παράδειγμα, η κανονική έκφραση `.ar` αναπαριστά: οποιονδήποτε
χαρακτήρα που ακολουθείται από το γράμμα `a`, που ακολουθείται από το γράμμα `r`.
<pre>
".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/xc9GkU/1)
## 2.2 Σύνολα Χαρακτήρων
Τα σύνολα χαρακτήρων καλούνται και κλάσεις χαρακτήρων. Για τον ορισμό αυτών
των συνόλων χρησιμοποιούνται αγκύλες. Για τον ορισμό της εμβέλειας ενός συνόλου
χαρακτήρων χρησιμοποιείται η παύλα. Η σειρά των χαρακτήρων, που βρίσκονται μέσα
εμβέλεια του συνόλου που ορίζεται από τις αγκύλες, δεν έχει σημασία. Για παράδειγμα,
η κανονική έκφραση `[Tt]he` αναπαριστά: ένα κεφαλαίο `T` ή πεζό `t`, που ακολουθείται
από το γράμμα `h`, που ακολουθείται από το γράμμα `e`.
<pre>
"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/2ITLQ4/1)
Όμως, μια τελεία μέσα σε ένα σύνολο χαρακτήρων, είναι μια κλασική τελεία. Η κανονική
έκφραση `ar[.]` αναπαριστά: ένα πεζό γράμμα `a`, που ακολουθείται από το γράμμα `r`,
που ακολουθείται από τον χαρακτήρα `.`.
<pre>
"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a>
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/wL3xtE/1)
### 2.2.1 Σύνολο Χαρακτήρων προς Εξαίρεση
Γενικά, το σύμβολο ^ αναπαριστά την αρχή ενός string, αλλά όταν γράφεται
μετά από το άνοιγμα αγκύλης, αναπαριστά ένα σύνολο χαρακτήρων προς εξαίρεση.
ΓΙα παράδειγμα, η κανονική έκφραση `[^c]ar` αναπαριστά: οποιονδήποτε χαρακτήρα
εκτός από το `c`, που ακολουθείται από τον χαρακτήρα `a`, που ακολουθείται από
το `r`.
<pre>
"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/nNNlq3/1)
## 2.3 Επαναλήψεις
Οι μεταχαρακτήρες `+`, `*` και `?`, χρησιμοποιούνται για να προσδιοριστεί
το πόσες φορές μπορεί να επαναληφθεί ένα υπό-μοτίβο χαρακτήρων. Αυτοί οι
μεταχαρακτήρες συμπεριφέρονται διαφορετικά ανάλογα με την περίπτωση.
### 2.3.1 Ο Αστερίσκος
Το σύμβολο `*` ταιριάζει με μηδέν ή παραπάνω επαναλήψεις της προηγούμενης έκφρασης.
Η κανονική έκφραση `a*` αναπαριστά: μηδέν ή παραπάνω επαναλήψεις του προηγούμενου
πεζού χαρακτήρα `a`. Αν όμως το σύμβολο βρίσκεται μετά από ένα σύνολο ή κλάση χαρακτήρων
τότε βρίσκει τις επαναλήψεις ολόκληρου του συνόλου. ΓΙα παράδειγμα, η κανονική έκφραση
`[a-z]*` αναπαριστά: οποιονδήποτε συνδυασμό πεζών γραμμάτων που βρίσκονται στην σειρά.
<pre>
"[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/7m8me5/1)
Το σύμβολο `*` μπορεί να χρησιμοποιηθεί σε συνδυασμό με τον χαρακτήρα `.` ώστε
να συγκρίνει μια ακολουθία χαρακτήρων `.*`. Μπορεί επίσης να χρησιμοποιηθεί με τον
χαρακτήρα κενού `\s` ώστε να συγκρίνει μια ακολουθία κενών. Για παράδειγμα, η
έκφραση `\s*cat\s*` αναπαριστά: μηδέν ή περισσότερα κενά, που ακολουθούνται από
τον πεζό χαρακτήρα `c`, που ακολουθείται από τον πεζό χαρακτήρα `a`, που ακολουθείται
από τον πεζό χαρακτήρα `t`, που ακολουθείται από μηδέν ή περισσότερα κενά.
<pre>
"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/gGrwuz/1)
### 2.3.2 Το Σύμβολο της Πρόσθεσης
Το σύμβολο `+` συγκρίνει μία ή περισσότερες επαναλήψεις του προηγούμενου χαρακτήρα.
Για παράδειγμα, η κανονική έκφραση `c.+t` αναπαριστά: το πεζό γράμμα `c`, που ακολουθείται
από τουλάχιστον ένα χαρακτήρα, που ακολουθείται από το πεζό γράμμα `t`. Πρέπει να διευκρινίσουμε
ότι το `t` είναι το τελευταίο `t` της πρότασης.
<pre>
"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/Dzf9Aa/1)
### 2.3.3 Το Ερωτηματικό
Σε μια κανονική έκφραση, ο μεταχαρακτήρας `?` κάνει τον προηγούμενο χαρακτήρα
προαιρετικό. Αυτό το σύμβολο συγκρίνει μηδέν ή παραπάνω περιπτώσεις εμφάνισης
του προηγούμενου χαρακτήρα. Για παράδειγμα, η κανονική έκφραση `[T]?he` αναπαριστά:
το προαιρετικό κεφαλαίο `T`, που ακολουθείται από πεζό `h`, που ακολουθείται από
πεζό `e`.
<pre>
"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/cIg9zm/1)
<pre>
"[T]?he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in t<a href="#learn-regex"><strong>he</strong></a> garage.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/kPpO2x/1)
## 2.4 Αγκύλες
Οι αγκύλες στις κανονικές εκφράσεις ονομάζονται αλλιώς και "ποσοτικοποιητές" αφού
χρησιμοποιούνται για τον καθορισμό του αριθμού επαναλήψεων ενός χαρακτήρα ή μιας
ομάδας χαρακτήρων. ΓΙα παράδειγμα, η κανονική έκφραση `[0-9]{2,3}` αναπαριστά: την
σύγκριση τουλάχιστον 2 ψηφίων αλλά όχι παραπάνω από 3 (στους χαρακτήρες από το 0 ως το 9).
<pre>
"[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/juM86s/1)
Μπορούμε να παραλείψουμε τον δεύτερο αριθμό. Για παράδειγμα, η κανονική έκφραση
`[0-9]{2,}` αναπαριστά: την σύγκριση 2 ή περισσότερων ψηφίων. Αν αφαιρέσουμε και
την κόμμα, τότε η κανονική έκφραση `[0-9]{3}` αναπαριστά: την σύγκριση ακριβώς 3 ψηφίων.
<pre>
"[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/Gdy4w5/1)
<pre>
"[0-9]{3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to 10.0.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/Sivu30/1)
## 2.5 Ομάδα Χαρακτήρων
Μια ομάδα χαρακτήρων είναι μια ομάδα υπό-μοτίβων που γράφονται μέσα σε παρενθέσεις `(...)`.
Όπως είπαμε και προηγουμένως, σε μια κανονική έκφραση, αν τοποθετήσουμε ένα ποσοτικοποιητή μετά από έναν
χαρακτήρα, τότε θα επαναλάβει τον προηγούμενο χαρακτήρα. Αλλά αν τον βάλουμε μετά
από μια ομάδα χαρακτήρων, τότε επαναλαμβάνει ολόκληρη την ομάδα. Για παράδειγμα,
η κανονική έκφραση `(ab)*` ταιριάζει με μηδέν ή παραπάνω επαναλήψεις του χαρακτήρα
"ab". Ακόμη, μπορούμε να χρησιμοποιήσουμε τον μεταχαρακτήρα εναλλαγής `|` μέσα στην ομάδα χαρακτήρων.
Για παράδειγμα, η κανονική έκφραση `(c|g|p)ar` αναπαριστά: τους πεζούς χαρακτήρες `c`,
`g` ή `p`, που ακολουθούνται από τον χαρακτήρα `a`, που ακολουθείται από τον χαρακτήρα `r`.
<pre>
"(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/tUxrBG/1)
## 2.6 Εναλλαγή
Στις κανονικές εκφράσεις, η κάθετη γραμμή `|`, ορίζει μια εναλλαγή.
Έτσι δηλαδή ορίζεται μια επιλογή μεταξύ πολλαπλών εκφράσεων. Ίσως σκέφτεσαι ότι
η εναλλαγή και τα σύνολα , λειτουργούν με τον ίδιο τρόπο. Αλλά η μεγάλη διαφορά τους
είναι ότι τα σύνολα χαρακτήρων δουλεύουν με χαρακτήρες ενώ η εναλλαγή με εκφράσεις.
Για παράδειγμα, η κανονική έκφραση `(T|t)he|car` αναπαριστά: τον κεφαλαίο χαρακτήρα `T`
ή τον πεζό χαρακτήρα `t`, που ακολουθείται από πεζό χαρακτήρα `h`, που ακολουθείται από
πεζό χαρακτήρα `e` ή πεζό χαρακτήρα `c`, που ακολουθείται από πεζό χαρακτήρα `a`, που
ακολουθείται από πεζό χαρακτήρα `r`.
<pre>
"(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/fBXyX0/1)
## 2.7 Ειδικός Χαρακτήρας Διαφυγής
Το σύμβολο `\` χρησιμοποιείται στις κανονικές εκφράσεις ώστε να αγνοηθεί ο επόμενος χαρακτήρας.
Αυτό μας επιτρέπει να ορίσουμε ως χαρακτήρα προς σύγκριση ένα σύμβολο, συμπεριλαμβανομένου των ειδικών
χαρακτήρων `{ } [ ] / \ + * . $ ^ | ?`. Για να χρησιμοποιήσετε έναν ειδικό χαρακτήρα μ'αυτόν τον τρόπο,
τοποθετήστε πριν από αυτόν το σύμβολο `\`.
Για παράδειγμα, η κανονική έκφραση `.` χρησιμοποιείται για σύγκριση με οποιονδήποτε χαρακτήρα εκτός από
αυτόν για την νέα γραμμή. Η παρακάτω κανονική έκφραση ψάχνει για `.` σε ένα string εισόδου. Η
`(f|c|m)at\.?` αναπαριστά: ένα πεζό γράμμα `f`, `c` ή `m`, που ακολουθείται από τον πεζό
χαρακτήρα `a`, που ακολουθείται από το πεζό γράμμα `t`, που ακολουθείται από τον προαιρετικό χαρακτήρα `.`.
<pre>
"(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a>
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/DOc5Nu/1)
## 2.8 Σύμβολα "Άγκυρες"
Σε μια κανονική έκφραση, χρησιμοποιούμε άγκυρες για να ελέγξουμε αν το σύμβολο προς εύρεση είναι
το αρχικό ή το τελικό σύμβολο ενός string. Οι άγκυρες είναι δύο τύπων:
Πρώτα είναι το σύμβολο `^` που ελέγχει αν ο χαρακτήρας που ψάχνουμε είναι ο αρχικός
χαρακτήρας της εισόδου και μετά είναι το σύμβολο του δολαρίου `$` που ελέγχει αν ο χαρακτήρας που
ψάχνουμε είναι ο τελευταίος στο string εισόδου.
### 2.8.1 Το Σύμβολο ^
Το σύμβολο `^` χρησιμοποιείται για να ελέγξουμε αν ο χαρακτήρας που ψάχνουμε είναι ο πρώτος χαρακτήρας
του string εισόδου. Αν δοκιμάσουμε την παρακάτω κανονική έκφραση `^a` (αν το a είναι το αρχικό
σύμβολο) στο string εισόδου `abc`, ταιριάζει με το `a`. Αλλά αν δοκιμάσουμε την κανονική έκφραση
`^b` στην παραπάνω είσοδο τότε δεν ταιριάζει με τίποτα.
Αυτό συμβαίνει επειδή στην έκφραση `abc` το "b" δεν είναι ο αρχικός χαρακτήρας. Ας ρίξουμε μια ματιά
στην κανονική έκφραση `^(T|t)he` η οποία ψάχνει για: έναν κεφαλαίο χαρακτήρα `T` ή έναν
πεζό χαρακτήρα `t` που να είναι οι πρώτοι χαρακτήρες τις εισόδου και να ακολουθούνται από
έναν πεζό χαρακτήρα `h`, που ακολουθείται από έναν πεζό χαρακτήρα `e`.
<pre>
"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/5ljjgB/1)
<pre>
"^(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/jXrKne/1)
### 2.8.2 Το Δολάριο
Το σύμβολο του δολαρίου `$` χρησιμοποιείται για να ελέγξουμε αν ο χαρακτήρας προς σύγκριση είναι ο τελευταίος
χαρακτήρας του string εισόδου. ΓΙα παράδειγμα, η κανονική έκφραση `(at\.)$` αναπαριστά: έναν
πεζό χαρακτήρα `a`, που ακολουθείται από έναν πεζό χαρακτήρα `t`, που ακολουθείται από μια τελεία `.`
και όλα αυτά πρέπει να είναι οι τελευταίοι χαρακτήρες της εισόδου.
<pre>
"(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a>
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/y4Au4D/1)
<pre>
"(at\.)$" => The fat cat. sat. on the m<a href="#learn-regex"><strong>at.</strong></a>
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/t0AkOd/1)
## 3. Συντομογραφίες Συνόλων Χαρακτήρων
Οι κανονικές εκφράσεις μας παρέχουν συντομογραφίες για τα σύνολα χαρακτήρων που
χρησιμοποιούνται πιο συχνά, κάτι που μας προσφέρει βολικές συντομογραφίες για τις πιο συχνά
χρησιμοποιούμενες κανονικές εκφράσεις. Οι συντομογραφίες των συνόλων χαρακτήρων είναι οι
παρακάτω:
|Συντομογραφία|Περιγραφή|
|:----:|----|
|.|Όλοι οι χαρακτήρες εκτός από αυτόν για νέα γραμμή|
|\w|Ταίριασμα με αλφαριθμητικούς χαρακτήρες: `[a-zA-Z0-9_]`|
|\W|Ταίριασμα με μη αλφαριθμητικούς χαρακτήρες: `[^\w]`|
|\d|Ταίριασμα με τα ψηφία: `[0-9]`|
|\D|Ταίριασμα με τα μη ψηφία: `[^\d]`|
|\s|Ταίριασμα με τον χαρακτήρα του κενού: `[\t\n\f\r\p{Z}]`|
|\S|Ταίριασμα με τους χαρακτήρες που δεν είναι το κενό: `[^\s]`|
## 4. Αναζήτηση
Η προς τα μπροστά και προς τα πίσω αναζήτηση, είναι συγκεκριμένοι τύποι συνόλων που
ονομάζονται ***non-capturing groups*** (Χρησιμοποιούνται για να συγκριθούν με κάποιο μοτίβο
αλλά δεν συμπεριλαμβάνονται στην λίστα προς σύγκριση). Οι αναζητήσεις προς τα μπροστά, χρησιμοποιούνται
όταν το μοτίβο έχει πριν ή μετά ένα ακόμη μοτίβο. Για παράδειγμα, αν θέλουμε να βρούμε όλους
τους αριθμούς που βρίσκονται μετά τον χαρακτήρα `$` στο παρακάτω string
`$4.44 and $10.88`, τότε θα χρησιμοποιήσουμε την κανονική έκφραση `(?<=\$)[0-9\.]*`
η οποία: βρίσκει όλους τους αριθμούς που περιέχουν τον χαρακτήρα `.` και ο προηγούμενος χαρακτήρας
είναι το `$`. Παρακάτω μπορείτε να δείτε τις αναζητήσεις που χρησιμοποιούνται στις κανονικές εκφράσεις:
|Σύμβολο|Περιγραφή|
|:----:|----|
|?=|Θετική Αναζήτηση προς τα Μπροστά|
|?!|Αρνητική Αναζήτηση προς τα Μπροστά|
|?<=|Positive Lookbehind|
|?<!|Negative Lookbehind|
### 4.1 Θετική Αναζήτηση προς τα Μπροστά
Η θετική αναζήτηση προς τα μπροστά, εγγυάται ότι το πρώτο μέρος της έκφρασης θα
ακολουθείται από την ανάλογη έκφραση για προς τα μπροστά αναζήτηση. Το αποτέλεσμα
περιέχει μόνο το κείμενο που ταιριάζει στο πρώτο κομμάτι της έκφρασης. Για να ορίσουμε
μια τέτοια αναζήτηση, χρησιμοποιούμε παρενθέσεις. Μέσα σε αυτές, τοποθετούμε ένα ερωτηματικό
και ένα ίσον όπως παρακάτω: `(?=...)`. Η έκφραση για προς τα μπροστά αναζήτηση, γράφεται μετά
το σύμβολο του ίσον μέσα στις παρενθέσεις. Για παράδειγμα, η κανονική έκφραση
`(T|t)he(?=\sfat)` αναπαριστά: είτε το πεζό γράμμα `t` είτε το κεφαλαίο γράμμα
`T`, που ακολουθείται από το γράμμα `h`, που ακολουθείται από το γράμμα `e`. Μέσα στις
παρενθέσεις, ορίζουμε την θετική προς τα μπροστά αναζήτηση, η οποία λέει στην μηχανή
της κανονικής έκφρασης να ταιριάξει τα `The` ή τα `the` που ακολουθούνται από την λέξη `fat`.
<pre>
"(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/IDDARt/1)
### 4.2 Αρνητική Αναζήτηση προς τα Μπροστά
Η αρνητική αναζήτηση προς τα μπροστά, χρησιμοποιείται όταν θέλουμε όλες τις εκφράσεις που
ταιριάζουν με το μοτίβο προς σύγκριση, που δεν ακολουθούνται όμως από άλλο μοτίβο.
Ορίζεται όπως και η παραπάνω αναζήτηση αλλά αντί για το σύμβολο `=` χρησιμοποιούμε το `!`,
για παράδειγμα `(?!...)`. Ας δούμε την κανονική έκφραση `(T|t)he(?!\sfat)` η οποία: επιστρέφει
όλα τα `The` ή `the` που υπάρχουν στο string εισόδου και δεν ακολουθούνται από την λέξη `fat`
μετά από κενό.
<pre>
"(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/V32Npg/1)
### 4.3 Θετική Αναζήτηση προς τα Πίσω
Η θετική αναζήτηση προς τα πίσω, χρησιμοποιείται όταν θέλουμε όλες τις εκφράσεις που
ταιριάζουν με το μοτίβο που βρίσκεται πριν από αυτές. Αυτή η αναζήτηση ορίζεται με τα
σύμβολα `(?<=...)`. Για παράδειγμα, η κανονική έκφραση `(?<=(T|t)he\s)(fat|mat)`:
επιστρέφει όλες τις λέξεις `fat` ή `mat` που βρίσκονται μετά την λέξη `The` ή `the`.
<pre>
"(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/avH165/1)
### 4.4 Αρνητική Αναζήτηση προς τα Πίσω
Η αρνητική αναζήτηση προς τα πίσω χρησιμοποιείται όταν θέλουμε όλες τις εκφράσεις που
ταιριάζουν χωρίς όμως να υπάρχει κάποιο μοτίβο πριν από αυτές. Αυτή η αναζήτηση ορίζεται με τα
σύμβολα `(?<!...)`. Για παράδειγμα, η κανονική έκφραση `(?<!(T|t)he\s)(cat)`: επιστρέφει όλες
τις λέξεις `cat` που δεν βρίσκονται μετά από την λέξη `The` ή `the`.
<pre>
"(?&lt;!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/8Efx5G/1)
## 5. Σημαίες
Οι σημαίες καλούνται αλλιώς και τροποποιητές αφού μετασχηματίζουν την έξοδο μιας
κανονικής έκφρασης. Μπορούν να χρησιμοποιηθούν με οποιαδήποτε σειρά ή συνδυασμό
και είναι αναπόσπαστο κομμάτι των RegExp.
|Σημαία|Περιγραφή|
|:----:|----|
|i|Αλλάζει την αναζήτηση ώστε να μην ενδιαφέρεται για τον αν τα γράμματα είναι πεζά ή κεφαλαία.|
|g|Καθολική αναζήτηση: Ψάχνει ένα μοτίβο σε ολόκληρο το string εισόδου.|
|m|Πολλαπλές γραμμές: Ο μεταχαρακτήρας άγκυρα λειτουργεί σε όλες τις γραμμές.|
### 5.1 Χωρίς Διάκριση Πεζών-Κεφαλαίων
Ο τροποποιητής `i` χρησιμοποιείται για αναζήτηση που δεν κάνει διακρίσεις μεταξύ πεζών
και κεφαλαίων γραμμάτων. Για παράδειγμα, η κανονική έκφραση `/The/gi` αναπαριστά: ένα
κεφαλαίο γράμμα `T`, που ακολουθείται έναν πεζό χαρακτήρα `h`, που ακολουθείται τον χαρακτήρα `e`.
Και στο τέλος της κανονικής έκφρασης υπάρχει η σημαία `i` η οποία λέει στην μηχανή της κανονικής
έκφρασης να αγνοήσει το αν ένας χαρακτήρας είναι πεζός ή κεφαλαίος. Όπως βλέπεται υπάρχει και η
σημαία `g` ώστε η αναζήτηση του μοτίβου να γίνει σε όλο το string εισόδου.
<pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/dpQyf9/1)
<pre>
"/The/gi" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/ahfiuh/1)
### 5.2 Καθολική Αναζήτηση
Ο τροποποιητής `g`χρησιμοποιείται για καθολική αναζήτηση (να βρει δηλαδή όλες τις
περιπτώσεις που ταιριάζουν και να μην σταματήσει στην πρώτη). Για παράδειγμα, η
κανονική έκφραση `/.(at)/g` αναπαριστά: οποιονδήποτε χαρακτήρα εκτός από αυτόν για
νέα γραμμή, που ακολουθείται από τον πεζό χαρακτήρα `a`, που ακολουθείται από τον πεζό
χαρακτήρα `t`. Αφού στο τέλος της κανονικής έκφρασης υπάρχει και η σημαία `g`,
θα βρεθούν όλα τα ταιριάσματα στο string εισόδου και όχι μόνο το πρώτο (που είναι η προκαθορισμένη
συμπεριφορά).
<pre>
"/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/jnk6gM/1)
<pre>
"/.(at)/g" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> <a href="#learn-regex"><strong>sat</strong></a> on the <a href="#learn-regex"><strong>mat</strong></a>.
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/dO1nef/1)
### 5.3 Πολλές Γραμμές
Ο τροποποιητής `m` χρησιμοποιείται για αναζήτηση σε πολλές γραμμές. Όπως είπαμε
προηγουμένως, οι άγκυρες `(^, $)` χρησιμοποιούνται για να ελέγξουμε αν ένα μοτίβο
βρίσκεται στην αρχή ή στο τέλος του string εισόδου. Αν θέλουμε οι άγκυρες αυτές να
ισχύουν για κάθε γραμμή, τότε χρησιμοποιούμε την σημαία `m` flag. Για παράδειγμα, η
κανονική έκφραση `/at(.)?$/gm` αναπαριστά: τον πεζό χαρακτήρα `a`, που ακολουθείται
από τον πεζό χαρακτήρα `t` και προαιρετικά οτιδήποτε άλλο εκτός από τον χαρακτήρα για
νέα γραμμή. Και αφού υπάρχει και η σημαία `m`, η μηχανή της κανονικής έκφρασης θα
ταιριάζει το μοτίβο στο τέλος κάθε γραμμής του string.
<pre>
"/.at(.)?$/" => The fat
cat sat
on the <a href="#learn-regex"><strong>mat.</strong></a>
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/hoGMkP/1)
<pre>
"/.at(.)?$/gm" => The <a href="#learn-regex"><strong>fat</strong></a>
cat <a href="#learn-regex"><strong>sat</strong></a>
on the <a href="#learn-regex"><strong>mat.</strong></a>
</pre>
[Δοκιμή της κανονικής έκφρασης](https://regex101.com/r/E88WE2/1)
## Contribution
* 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)
## License
MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com)