שימוש בביטויים רגולריים

Clojure:
שימוש בביטויים רגולריים

איך לעשות:

Clojure, נאמן לשורשיו במשפחת Lisp, מציע מערך עשיר של פונקציות המתממשקות בחלקות עם יכולות הביטוי הרגולרי של Java. הנה איך אפשר לנצל אותם:

התאמה בסיסית

כדי לבדוק אם מחרוזת מתאימה לתבנית, השתמשו ב- re-matches. היא מחזירה את ההתאמה המלאה אם הצליחה או nil אחרת.

(re-matches #"\d+" "123")  ;=> "123"
(re-matches #"\d+" "abc")  ;=> nil

חיפוש תבניות

כדי למצוא את הופעת התבנית הראשונה, re-find היא הפונקציה אליה תפנו:

(re-find #"\d+" "Order 123")  ;=> "123"

קיבוץ תפיסות

השתמשו ב- re-find יחד עם סוגריים בתבנית כדי לתפוס קבוצות:

(let [[_ area code] (re-find #"(1)?(\d{3})" "Phone: 123-4567")]
  (println "Area Code:" area "Code:" code))
;; פלט: Area Code: nil Code: 123

חיפוש גלובלי (מציאת כל ההתאמות)

ב-Clojure אין חיפוש גלובלי מובנה כמו בחלק מהשפות. במקום זאת, השתמשו ב- re-seq כדי לקבל רצף עצלן של כל ההתאמות:

(re-seq #"\d+" "id: 123, qty: 456")  ;=> ("123" "456")

פיצול מחרוזות

כדי לפצל מחרוזת בהתבסס על תבנית, השתמשו ב- clojure.string/split:

(clojure.string/split "John,Doe,30" #",")  ;=> ["John" "Doe" "30"]

החלפה

החליפו חלקים ממחרוזת שמתאימים לתבנית עם clojure.string/replace:

(clojure.string/replace "2023-04-01" #"\d{4}" "YYYY")  ;=> "YYYY-04-01"

ספריות צד שלישי

למרות שהתמיכה המובנית של Clojure מספיקה לרוב המקרים, לסיטואציות מורכבות יותר, שקלו שימוש בספריות כמו clojure.spec לאימות נתונים תקף ו-reagent לניהול DOM ריאקטיבי ביישומי אינטרנט עם ניתוב ואימות קלט מבוססי ביטויים רגולריים.

;; דוגמה של שימוש ב-clojure.spec לאימות דואר אלקטרוני
(require '[clojure.spec.alpha :as s])
(s/def ::email (s/and string? #(re-matches #".+@.+\..+" %)))
(s/valid? ::email "[email protected]")  ;=> נכון

זכרו, למרות שביטויים רגולריים הם כלי עוצמתי, הם גם יכולים להפוך קוד לקשה לקריאה ולתחזוקה. השתמשו בהם בשיקול דעת ותמיד שקלו פונקציות פשוטות יותר של ניהול מחרוזות ככל הניתן.