Οι κανονικές εκφράσεις (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
\, π.χ. ~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!"