Εισαγωγή στις Κανονικές Εκφράσεις (Regular Expressions) στην C#

Οι κανονικές εκφράσεις (regular expressions ή regex) είναι ένα πανίσχυρο εργαλείο για την αναζήτηση και τον χειρισμό κειμένου. Επιτρέπουν την περιγραφή σύνθετων μοτίβων για την εύρεση και την επεξεργασία συμβολοσειρών. Στην C#, οι κανονικές εκφράσεις χρησιμοποιούνται συχνά για επαλήθευση δεδομένων, αναζήτηση κειμένου και αντικατάσταση.

Βασικά Στοιχεία των Κανονικών Εκφράσεων

  1. Κατασκευή Regex: Για να δημιουργήσετε μια κανονική έκφραση στην C#, χρησιμοποιείτε την κλάση Regex που βρίσκεται στο namespace System.Text.RegularExpressions.
  1. Βασικοί Τελεστές:
    • .: Αντιστοιχεί σε οποιονδήποτε χαρακτήρα εκτός από νέο γραμμή.
    • *: Μηδέν ή περισσότερες φορές.
    • +: Μία ή περισσότερες φορές.
    • ?: Μηδέν ή μία φορά.
    • []: Καθορίζει ένα σύνολο χαρακτήρων. Για παράδειγμα, [a-z] αντιστοιχεί σε οποιονδήποτε πεζό χαρακτήρα.
  1. Ειδικοί Χαρακτήρες: Οι ειδικοί χαρακτήρες χρειάζονται διαφυγή (escaping) όταν θέλουμε να τους χρησιμοποιήσουμε ως κανονικούς χαρακτήρες. Για παράδειγμα, για να χρησιμοποιήσετε τον χαρακτήρα . ως κανονικό σημείο, θα πρέπει να γράψετε \..

Παράδειγμα Χρήσης Κανονικών Εκφράσεων στην C#

Ας δούμε ένα απλό παράδειγμα όπου ελέγχουμε αν μια συμβολοσειρά είναι μια έγκυρη διεύθυνση email:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string emailPattern = @”^[^@\s]+@[^@\s]+.[^@\s]+$”;
string inputEmail = “example@example.com”;

if (Regex.IsMatch(inputEmail, emailPattern))
{
Console.WriteLine(“Η διεύθυνση email είναι έγκυρη.”);
}
else
{
Console.WriteLine(“Η διεύθυνση email δεν είναι έγκυρη.”);
}
}

}

Ανάλυση του Παραδείγματος

  1. Ορισμός Μοτίβου: Το μοτίβο @"^[^@\s]+@[^@\s]+\.[^@\s]+$" αντιστοιχεί σε μια τυπική διεύθυνση email.
    • ^: Αρχή της συμβολοσειράς.
    • [^@\s]+: Ένας ή περισσότεροι χαρακτήρες που δεν είναι το σύμβολο @ ή διάστημα.
    • @: Το σύμβολο @.
    • [^@\s]+: Ένας ή περισσότεροι χαρακτήρες που δεν είναι το σύμβολο @ ή διάστημα.
    • \.: Ένα σημείο.
    • [^@\s]+: Ένας ή περισσότεροι χαρακτήρες που δεν είναι το σύμβολο @ ή διάστημα.
    • $: Τέλος της συμβολοσειράς.

  1. Επαλήθευση: Χρησιμοποιούμε τη μέθοδο Regex.IsMatch για να ελέγξουμε αν η είσοδος ταιριάζει με το μοτίβο.

Χρήσιμες Μέθοδοι της Κλάσης Regex

  • IsMatch: Ελέγχει αν η συμβολοσειρά ταιριάζει με το μοτίβο.
  • Match: Επιστρέφει το πρώτο κομμάτι της συμβολοσειράς που ταιριάζει με το μοτίβο.
  • Matches: Επιστρέφει όλες τις αντιστοιχίες που βρέθηκαν στη συμβολοσειρά.
  • Replace: Αντικαθιστά τις αντιστοιχίες που βρέθηκαν με μια άλλη συμβολοσειρά.

Παράδειγμα Αντικατάστασης Χαρακτήρων

Ας δούμε ένα παράδειγμα όπου αντικαθιστούμε όλους τους αριθμούς σε μια συμβολοσειρά με το χαρακτήρα #

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”\d”;
string input = “Password123”;
string replacement = “#”;

string result = Regex.Replace(input, pattern, replacement);
Console.WriteLine(result); // Εκτυπώνει “Password###”
}
}

Συμπέρασμα

Οι κανονικές εκφράσεις είναι ένα πολύτιμο εργαλείο για την επεξεργασία κειμένου στην C#. Παρέχουν μεγάλη ευελιξία και μπορούν να κάνουν την αναζήτηση και τον χειρισμό κειμένου πολύ πιο αποτελεσματικά. Με την κατανόηση των βασικών αρχών και τη σωστή χρήση των εργαλείων της κλάσης Regex, μπορείτε να βελτιώσετε σημαντικά την ποιότητα και την αποδοτικότητα του κώδικά σας.

Χρήση και Υλοποίηση Κανονικών Εκφράσεων (Regular Expressions) στην C#

Οι κανονικές εκφράσεις (regular expressions ή regex) είναι μια ισχυρή τεχνική που χρησιμοποιείται για την αναζήτηση, την επαλήθευση και την επεξεργασία κειμένου. Οι κανονικές εκφράσεις χρησιμεύουν σε πολλές εφαρμογές, όπως:

  1. Επαλήθευση Εισόδου: Για να βεβαιωθούμε ότι τα δεδομένα που εισάγονται από τον χρήστη πληρούν συγκεκριμένα κριτήρια (π.χ. έγκυρες διευθύνσεις email, αριθμοί τηλεφώνου κ.λπ.).
  2. Αναζήτηση και Αντικατάσταση: Για να βρούμε και να αντικαταστήσουμε συγκεκριμένα μοτίβα κειμένου μέσα σε μια μεγαλύτερη συμβολοσειρά.
  3. Διάσπαση Κειμένου: Για να σπάσουμε μια συμβολοσειρά σε μικρότερα κομμάτια βάσει ενός καθορισμένου μοτίβου.
  4. Εξαγωγή Δεδομένων: Για να εξαγάγουμε συγκεκριμένες πληροφορίες από μεγάλες ποσότητες κειμένου.

Βασικές Αρχές των Κανονικών Εκφράσεων

Οι κανονικές εκφράσεις αποτελούνται από μοτίβα που περιγράφουν σύνολα συμβολοσειρών. Ας δούμε μερικούς βασικούς τελεστές και χαρακτήρες που χρησιμοποιούνται στις κανονικές εκφράσεις:

  • .: Αντιστοιχεί σε οποιονδήποτε χαρακτήρα εκτός από το νέο γραμμή.
  • ^: Αρχή της γραμμής.
  • $: Τέλος της γραμμής.
  • *: Μηδέν ή περισσότερες φορές.
  • +: Μία ή περισσότερες φορές.
  • ?: Μηδέν ή μία φορά.
  • []: Σύνολο χαρακτήρων. Για παράδειγμα, [a-z] αντιστοιχεί σε οποιονδήποτε πεζό χαρακτήρα.
  • \d: Οποιοσδήποτε ψηφία (ισοδύναμο με [0-9]).
  • \w: Οποιοσδήποτε αλφαριθμητικός χαρακτήρας (ισοδύναμο με [a-zA-Z0-9_]).
  • \s: Οποιοσδήποτε χαρακτήρας κενού (διάστημα, ταμπ, νέο γραμμή).

Υλοποίηση στην C#

Για να χρησιμοποιήσετε κανονικές εκφράσεις στην C#, θα χρησιμοποιήσετε την κλάση Regex που βρίσκεται στο namespace System.Text.RegularExpressions.


Χρήσιμες Μέθοδοι της Κλάσης Regex

Λειτουργία των Χρήσιμων Μεθόδων της Κλάσης Regex στην C#

Η κλάση Regex στην C# παρέχει πολλές χρήσιμες μεθόδους για την εργασία με κανονικές εκφράσεις. Αυτές οι μέθοδοι σας επιτρέπουν να αναζητάτε, να επαληθεύετε, να αντικαθιστάτε και να διασπάτε κείμενο με βάση τα μοτίβα κανονικών εκφράσεων.

Ας δούμε αναλυτικά πώς λειτουργούν αυτές οι μέθοδοι.

1. Regex.IsMatch

Η μέθοδος IsMatch χρησιμοποιείται για να ελέγξετε αν μια συμβολοσειρά ταιριάζει με το καθορισμένο μοτίβο κανονικής έκφρασης.

Σύνταξη:

  • IsMatch: Ελέγχει αν μια συμβολοσειρά ταιριάζει με το καθορισμένο μοτίβο.

bool isMatch = Regex.IsMatch(input, pattern);

public static bool IsMatch(string input, string pattern);
public bool IsMatch(string input);

Παράδειγμα:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”^\d{3}-\d{2}-\d{4}$”;
string input = “123-45-6789”;

bool isMatch = Regex.IsMatch(input, pattern);

Console.WriteLine(isMatch ? “Το μοτίβο ταιριάζει.” : “Το μοτίβο δεν ταιριάζει.”);
}

}

Σε αυτό το παράδειγμα, το μοτίβο ελέγχει αν η συμβολοσειρά είναι μια έγκυρη μορφή αριθμού κοινωνικής ασφάλισης των ΗΠΑ.

2. Regex.Match

Η μέθοδος Match χρησιμοποιείται για να βρείτε την πρώτη αντιστοιχία μιας συμβολοσειράς με το καθορισμένο μοτίβο.

Σύνταξη:

public static Match Match(string input, string pattern);
public Match Match(string input);

Match: Επιστρέφει το πρώτο κομμάτι της συμβολοσειράς που ταιριάζει με το μοτίβο.

Match match = Regex.Match(input, pattern);

Παράδειγμα

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”\d+”;
string input = “My phone number is 123-456-7890”;

Match match = Regex.Match(input, pattern);

if (match.Success)
{
Console.WriteLine($”Βρέθηκε αντιστοιχία: {match.Value}”);
}
}

}

Σε αυτό το παράδειγμα, το μοτίβο \d+ αναζητά την πρώτη ακολουθία ψηφίων στην είσοδο.

3. Regex.Matches

Η μέθοδος Matches χρησιμοποιείται για να βρείτε όλες τις αντιστοιχίες μιας συμβολοσειράς με το καθορισμένο μοτίβο.

Σύνταξη:

Matches: Επιστρέφει όλες τις αντιστοιχίες που βρέθηκαν στη συμβολοσειρά.

public static MatchCollection Matches(string input, string pattern);
public MatchCollection Matches(string input);

MatchCollection matches = Regex.Matches(input, pattern);

παράδειγμα

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”\b\w+\b”;
string input = “This is a sample sentence.”;

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)
{
Console.WriteLine($”Βρέθηκε λέξη: {match.Value}”);
}
}

}

Σε αυτό το παράδειγμα, το μοτίβο \b\w+\b αναζητά όλες τις λέξεις στην είσοδο.

4. Regex.Replace

Η μέθοδος Replace χρησιμοποιείται για να αντικαταστήσετε όλες τις αντιστοιχίες μιας συμβολοσειράς με το καθορισμένο μοτίβο με μια άλλη συμβολοσειρά.

Σύνταξη:

public static string Replace(string input, string pattern, string replacement);
public string Replace(string input, string replacement);

string result = Regex.Replace(input, pattern, replacement);

παράδειγμα

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”\d”;
string input = “Password123”;
string replacement = “#”;

string result = Regex.Replace(input, pattern, replacement);

Console.WriteLine(result); // Εκτυπώνει “Password###”
}

}

Σε αυτό το παράδειγμα, το μοτίβο \d αναζητά όλους τους ψηφιακούς χαρακτήρες και τους αντικαθιστά με το σύμβολο #.

5. Regex.Split

Η μέθοδος Split χρησιμοποιείται για να διασπάσετε μια συμβολοσειρά σε ένα πίνακα συμβολοσειρών βάσει ενός καθορισμένου μοτίβου.

Σύνταξη:

Split: Διαχωρίζει μια συμβολοσειρά σε ένα πίνακα συμβολοσειρών βάσει του μοτίβου.

string[] result = Regex.Split(input, pattern);

public static string[] Split(string input, string pattern);
public string[] Split(string input);

παράδειγμα

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”\s+”;
string input = “This is a sample sentence.”;

string[] result = Regex.Split(input, pattern);

foreach (string word in result)
{
Console.WriteLine(word);
}
}

}

Σε αυτό το παράδειγμα, το μοτίβο \s+ χρησιμοποιείται για να διασπάσει την είσοδο σε λέξεις με βάση τα κενά διαστήματα.

Προχωρημένα Χαρακτηριστικά και Τεχνικές των Κανονικών Εκφράσεων (Regex) στην C#

Οι κανονικές εκφράσεις στην C# προσφέρουν πολλές προηγμένες δυνατότητες που μπορούν να βελτιώσουν σημαντικά τις δεξιότητες σας στην επεξεργασία κειμένου. Παρακάτω παρουσιάζονται μερικά από αυτά τα χαρακτηριστικά και τεχνικές:

1. Ομάδες (Groups)

Οι ομάδες χρησιμοποιούνται για να συλλάβουν και να αποθηκεύσουν συγκεκριμένα μέρη της συμβολοσειράς που ταιριάζουν με το μοτίβο.

Πώς λειτουργούν: Μια ομάδα ορίζεται με παρενθέσεις ( ... ). Οτιδήποτε περιλαμβάνεται μέσα σε αυτές τις παρενθέσεις θεωρείται ως μια ομάδα, και η αντιστοιχία της ομάδας μπορεί να ανακτηθεί αργότερα.

Παράδειγμα:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”(\d{3})-(\d{2})-(\d{4})”;
string input = “123-45-6789”;

Match match = Regex.Match(input, pattern);

if (match.Success)
{
Console.WriteLine($”Ολόκληρη η αντιστοιχία: {match.Value}”);
Console.WriteLine($”Ομάδα 1: {match.Groups[1].Value}”);
Console.WriteLine($”Ομάδα 2: {match.Groups[2].Value}”);
Console.WriteLine($”Ομάδα 3: {match.Groups[3].Value}”);
}
}

}

Σε αυτό το παράδειγμα, το μοτίβο (\d{3})-(\d{2})-(\d{4}) αναζητά αριθμούς μορφής XXX-XX-XXXX. Κάθε αριθμητική ακολουθία περιλαμβάνεται σε παρενθέσεις, δημιουργώντας τρεις ομάδες.

2. Μη-συλλαμβάνουσες Ομάδες (Non-capturing Groups)

Οι μη-συλλαμβάνουσες ομάδες χρησιμοποιούνται για ομαδοποίηση χωρίς να συλλαμβάνουν το περιεχόμενο. Αυτές οι ομάδες είναι χρήσιμες όταν θέλετε να εφαρμόσετε κάποια λογική σε ένα μέρος της έκφρασης χωρίς να αποθηκεύσετε το περιεχόμενο.

Πώς λειτουργούν: Μια μη-συλλαμβάνουσα ομάδα ορίζεται με (?: ... ).

Παράδειγμα:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”(?:\d{3})-(\d{2})-(\d{4})”;
string input = “123-45-6789”;

Match match = Regex.Match(input, pattern);

if (match.Success)
{
Console.WriteLine($”Ολόκληρη η αντιστοιχία: {match.Value}”);
}
}

}

Σε αυτό το παράδειγμα, το μοτίβο (?:\d{3})-(\d{2})-(\d{4}) αναζητά αριθμούς μορφής XXX-XX-XXXX, αλλά δεν συλλαμβάνει καμία από τις ομάδες.

3. Ονομασμένες Ομάδες (Named Groups)

Οι ονομασμένες ομάδες επιτρέπουν την πρόσβαση σε ομάδες μέσω ονομάτων αντί για αριθμούς. Αυτό κάνει τον κώδικα πιο κατανοητό και ευανάγνωστο.

Πώς λειτουργούν: Μια ονομασμένη ομάδα ορίζεται με (?<name> ... ).

Παράδειγμα:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”(?\d{3})-(?\d{2})-(?\d{4})”;
string input = “123-45-6789”;

Match match = Regex.Match(input, pattern);

if (match.Success)
{
Console.WriteLine($”Ολόκληρη η αντιστοιχία: {match.Value}”);
Console.WriteLine($”Area: {match.Groups[“area”].Value}”);
Console.WriteLine($”Prefix: {match.Groups[“prefix”].Value}”);
Console.WriteLine($”Line: {match.Groups[“line”].Value}”);
}
}

}

Σε αυτό το παράδειγμα, το μοτίβο (?<area>\d{3})-(?<prefix>\d{2})-(?<line>\d{4}) αναζητά αριθμούς μορφής XXX-XX-XXXX και αποθηκεύει κάθε μέρος με ένα συγκεκριμένο όνομα.

4. Αναδρομική Αναφορά (Backreferences)

Η αναδρομική αναφορά επιτρέπει την αντιστοίχιση προηγούμενων συλλαμβανόμενων ομάδων μέσα στην ίδια κανονική έκφραση. Αυτό είναι χρήσιμο όταν θέλετε να βεβαιωθείτε ότι δύο μέρη της συμβολοσειράς είναι ίδια.

Πώς λειτουργεί: Η αναδρομική αναφορά σε μια ομάδα γίνεται με \1, \2, κ.λπ., όπου ο αριθμός αντιστοιχεί στη σειρά της ομάδας.

Παράδειγμα:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”(\b\w+)\s+\1\b”;
string input = “This is is a test test”;

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)
{
Console.WriteLine($”Βρέθηκε αναδρομική αντιστοιχία: {match.Value}”);
}
}

}

Σε αυτό το παράδειγμα, το μοτίβο (\b\w+)\s+\1\b αναζητά λέξεις που επαναλαμβάνονται.

5. Lookahead και Lookbehind

Οι εκφράσεις Lookahead και Lookbehind επιτρέπουν την αναζήτηση με βάση το πλαίσιο χωρίς να περιλαμβάνουν το πλαίσιο στην αντιστοιχία. Αυτό είναι χρήσιμο όταν θέλετε να επιβεβαιώσετε ότι μια αντιστοιχία ακολουθείται ή προηγείται από μια συγκεκριμένη ακολουθία χωρίς να την περιλάβετε στην αντιστοιχία.

Lookahead: Μια lookahead ορίζεται με (?= ... ).

Lookbehind: Μια lookbehind ορίζεται με (?<= ... ).

Παράδειγμα Lookahead:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”\d+(?= dollars)”;
string input = “I have 100 dollars”;

Match match = Regex.Match(input, pattern);

if (match.Success)
{
Console.WriteLine($”Βρέθηκε αντιστοιχία: {match.Value}”);
}
}

}

Παράδειγμα: Lookbehind

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”(?<=\$)\d+”;
string input = “The price is $100”;

Match match = Regex.Match(input, pattern);

if (match.Success)
{
Console.WriteLine($”Βρέθηκε αντιστοιχία: {match.Value}”);
}
}

}

6. Επιλογές Κανονικών Εκφράσεων (Regex Options)

Οι επιλογές κανονικών εκφράσεων επιτρέπουν την προσαρμογή της συμπεριφοράς των εκφράσεων, όπως η διάκριση πεζών-κεφαλαίων ή η πολλαπλών γραμμών αναζήτηση.

Πώς λειτουργούν: Οι επιλογές κανονικών εκφράσεων μπορούν να εφαρμοστούν ως παραμέτροι στις μεθόδους Regex. Μερικές από τις πιο συχνές επιλογές είναι:

  • RegexOptions.IgnoreCase: Αγνοεί τη διάκριση πεζών-κεφαλαίων.
  • RegexOptions.Multiline: Καθορίζει ότι οι άγκυρες ^ και $ θα αντιστοιχούν στην αρχή και το τέλος κάθε γραμμής αντί για ολόκληρο το κείμενο.
  • RegexOptions.Singleline: Καθορίζει ότι ο χαρακτήρας . θα αντιστοιχεί σε οποιονδήποτε χαρακτήρα, συμπεριλαμβανομένων των χαρακτήρων νέας γραμμής.
  • RegexOptions.Compiled: Βελτιστοποιεί την κανονική έκφραση για γρηγορότερη εκτέλεση, αν και μπορεί να αυξήσει τον χρόνο μεταγλώττισης.

Παράδειγμα:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string pattern = @”^abc”;
string input = “Abc def abc”;

// Χρήση επιλογής RegexOptions.IgnoreCase για διάκριση πεζών-κεφαλαίων
Match match = Regex.Match(input, pattern, RegexOptions.IgnoreCase);

if (match.Success)
{
Console.WriteLine($”Βρέθηκε αντιστοιχία: {match.Value}”);
}
}

}

Σε αυτό το παράδειγμα, η επιλογή RegexOptions.IgnoreCase επιτρέπει την αντιστοίχιση της λέξης “abc” ανεξάρτητα από τη διάκριση πεζών-κεφαλαίων.

Συμπέρασμα

Οι κανονικές εκφράσεις προσφέρουν ευέλικτες και ισχυρές δυνατότητες για την επεξεργασία κειμένου στην C#. Με την κατανόηση και την εφαρμογή προηγμένων χαρακτηριστικών, όπως οι ομάδες, οι αναδρομικές αναφορές και οι lookaheads/lookbehinds, μπορείτε να χειρίζεστε πιο σύνθετα μοτίβα και να βελτιώσετε την αποδοτικότητα του κώδικά σας. Οι επιλογές κανονικών εκφράσεων προσφέρουν πρόσθετες προσαρμογές για να καλύψουν τις ανάγκες σας.

video link:

Intro to Regular Expressions – How to use Regex in C#

Other Platforms Material:

What is Regular Expression in C#?

Best practices for regular expressions in .NET