Διαδρομές
/
Elixir
Elixir
/
Ύλη
/
Κανονικές εκφράσεις
Κα

Κανονικές εκφράσεις σε Elixir

24 ασκήσεις

Σχετικά με την έννοια Κανονικές εκφράσεις

Οι κανονικές εκφράσεις (regex) είναι ένα ισχυρό εργαλείο για την εργασία με συμβολοσειρές στην Elixir. Οι κανονικές εκφράσεις στην Elixir ακολουθούν την προδιαγραφή PCRE (Perl Compatible Regular Expressions). Τα μοτίβα συμβολοσειρών που αναπαριστούν το νόημα της κανονικής έκφρασης μεταγλωττίζονται πρώτα και έπειτα χρησιμοποιούνται για την αντιστοίχιση όλης ή μέρους μιας συμβολοσειράς.

Στην Elixir, ο πιο συνηθισμένος τρόπος για να δημιουργήσεις κανονικές εκφράσεις είναι χρησιμοποιώντας το sigil ~r. Τα sigils παρέχουν συντακτική ζάχαρη, συντομεύσεις για συνηθισμένες εργασίες στην Elixir. Σε αυτή την περίπτωση, το ~r είναι μια συντόμευση για τη χρήση του Regex.compile!/2.

Regex.compile!("test") == ~r/test/
# => true

Ο τελεστής =~/2 είναι χρήσιμος για να εκτελέσεις μια αντιστοίχιση regex σε μια συμβολοσειρά και να επιστρέψεις ένα boolean αποτέλεσμα.

"this is a test" =~ ~r/test/
# => true

Επισκόπηση της σύνταξης των regex

  • Ορισμένοι χαρακτήρες σε ένα μοτίβο κανονικής έκφρασης έχουν ειδική σημασία· για να χρησιμοποιήσεις τον χαρακτήρα αυτούσιο, πρέπει να τον κάνεις escape με \, π.χ. ~r/\?/.
  • Οι κλάσεις χαρακτήρων (π.χ. \d, \w) επιτρέπουν στα μοτίβα να αντιστοιχίζουν ένα εύρος χαρακτήρων
  • Οι εναλλαγές (|) επιτρέπουν στα μοτίβα να αντιστοιχίζουν ένα μοτίβο ή ένα άλλο
  • Οι ποσοδείκτες ({N, M}, *, ?) επιτρέπουν στα μοτίβα να αντιστοιχίζουν έναν καθορισμένο αριθμό επαναλαμβανόμενων μοτίβων
  • Οι ομάδες (()) επιτρέπουν σε μέρη των μοτίβων να λειτουργούν ως ενότητα

Συλλήψεις

Οι κανονικές εκφράσεις είναι επίσης χρήσιμες για την εξαγωγή ενός μέρους μιας συμβολοσειράς. Αυτό ονομάζεται σύλληψη. Για να συλλάβεις ένα μέρος μιας συμβολοσειράς, δημιούργησε μια ομάδα (()) για το μέρος που θέλεις να συλλάβεις και χρησιμοποίησε το Regex.run.

Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]

Οι συλλήψεις αριθμούνται (ξεκινώντας από το 1) και μπορούν επίσης να χρησιμοποιηθούν στο αποτέλεσμα όταν αντικαθιστάς μέρη μιας συμβολοσειράς με μια κανονική έκφραση:

Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"

Οι συλλήψεις μπορούν επίσης να ονομαστούν προσθέτοντας ?<name> μετά την παρένθεση ανοίγματος. Χρησιμοποίησε το Regex.named_captures/3 για να πάρεις ένα map με συλλήψεις με όνομα.

Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}

Τροποποιητές

Η συμπεριφορά μιας κανονικής έκφρασης μπορεί να τροποποιηθεί προσθέτοντας ειδικά flags στο τέλος της κανονικής έκφρασης, π.χ. ~r/test/i.

  • caseless i - χωρίς διάκριση πεζών/κεφαλαίων
    "A" =~ ~r/a/
    # => false
    "A" =~ ~r/a/i
    # => true
    
  • unicode u - ενεργοποιεί μοτίβα ειδικά για Unicode, όπως το \p, και κάνει κλάσεις χαρακτήρων όπως το \w κ.λπ. να αντιστοιχίζουν και σε Unicode
    "ö" =~ ~r/^\w$/
    # => false
    "ö" =~ ~r/^\w$/u
    # => true
    
  • Και άλλα: dotall, multiline, extended, firstline, ungreedy

Δυναμική δημιουργία κανονικών εκφράσεων

Επειδή το sigil ~r είναι συντόμευση για το "pattern" |> Regex.escape() |> Regex.compile!(), μπορείς επίσης να χρησιμοποιήσεις παρεμβολή συμβολοσειρών για να δημιουργήσεις δυναμικά ένα μοτίβο κανονικής έκφρασης:

anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true

Κανονικές εκφράσεις έναντι της ενότητας String

Αν και οι κανονικές εκφράσεις είναι ισχυρές, δεν είναι πάντα φρόνιμο να τις χρησιμοποιείς:

  • Πρέπει να μεταγλωττιστούν πριν από τη χρήση, κάτι που καταναλώνει χρόνο υπολογισμού και μνήμη.
  • Μπορεί να είναι πιο αργές από τη χρήση απλών συναρτήσεων συμβολοσειρών.

Κατά κανόνα, είναι καλύτερα να χρησιμοποιείς τις συναρτήσεις της ενότητας String όποτε είναι δυνατόν.

# Don't use regular expressions to check a suffix:
if "YELLING!" =~ ~r/!$/, do: "Whoa, chill out!"

# Use a string function:
if String.ends_with?("YELLING!", "!"), do: "Whoa, chill out!"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Κανονικές εκφράσεις

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 10 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Κανονικές εκφράσεις