Όπως ίσως ήδη γνωρίζετε, οι χορδές στο Ρουμπίνι είναι αυτά που είναι γνωστά ως αντικείμενα πρώτης κατηγορίας που χρησιμοποιούν μια σειρά μεθόδων για επερωτήσεις και χειρισμούς.
Ένα από τα πιο βασικά χειρισμού σειράς οι ενέργειες είναι να διαιρέσετε μια συμβολοσειρά σε πολλαπλές υπο-χορδές. Αυτό θα γίνει, για παράδειγμα, εάν έχετε μια συμβολοσειρά όπως"foo, μπαρ, baz" και θέλετε τις τρεις χορδές "foo", "bar" και "baz". ο διαίρεση μέθοδος της κλάσης String μπορεί να το κάνει αυτό για σας.
Η βασική χρήση του "Διαχωρισμού"
Η πιο βασική χρήση του διαίρεση η μέθοδος είναι να διαιρέσετε μια συμβολοσειρά βασισμένη σε έναν μοναδικό χαρακτήρα ή στατική ακολουθία χαρακτήρων. Εάν το πρώτο όρισμα του διαχωρισμού είναι μια συμβολοσειρά, οι χαρακτήρες σε αυτή τη συμβολοσειρά χρησιμοποιούνται ως οριοθέτης διαχωριστή συμβολοσειρών, ενώ στα δεδομένα που οριοθετούνται με κόμμα, το κόμμα χρησιμοποιείται για τη διαχωρισμό των δεδομένων.
#! / usr / bin / env ruby
str = "foo, bar, baz"
θέτει str.split (",")
$ ./1.rb
foo
μπαρ
baz
Προσθέστε ευελιξία με κανονικές εκφράσεις
Υπάρχουν ευκολότεροι τρόποι οριοθέτησης του σειρά. Χρησιμοποιώντας μια κανονική έκφραση ως ο οριοθέτης σας καθιστά τη μέθοδο διαίρεσης πολύ πιο ευέλικτη.
Και πάλι, πάρτε για παράδειγμα το string "foo, μπαρ, baz". Υπάρχει ένας χώρος μετά το πρώτο κόμμα, αλλά όχι μετά το δεύτερο. Εάν η συμβολοσειρά "," χρησιμοποιείται ως οριοθέτης, θα υπάρχει ακόμα ένας χώρος στην αρχή της συμβολοσειράς "bar". Εάν χρησιμοποιείται η συμβολοσειρά "," (με κενό μετά το κόμμα), θα ταιριάζει μόνο με το πρώτο κόμμα, καθώς το δεύτερο κόμμα δεν έχει κενό μετά από αυτό. Είναι πολύ περιοριστικό.
Η λύση σε αυτό το πρόβλημα είναι να χρησιμοποιήσετε μια κανονική έκφραση ως όριο οριοθέτη αντί για μια συμβολοσειρά. Οι κανονικές εκφράσεις σάς επιτρέπουν να αντιστοιχίζετε όχι μόνο στατικές ακολουθίες χαρακτήρων αλλά και απροσδιόριστους αριθμούς χαρακτήρων και προαιρετικούς χαρακτήρες.
Γράφοντας τακτικές εκφράσεις
Όταν γράφετε μια κανονική έκφραση για τον αποδιαμορφωτή σας, το πρώτο βήμα είναι να περιγράψετε με λέξεις τι είναι ο οριοθέτης. Σε αυτή την περίπτωση, η φράση "ένα κόμμα που μπορεί να ακολουθείται από ένα ή περισσότερα κενά" είναι λογικό.
Υπάρχουν δύο στοιχεία σε αυτό το regex: το κόμμα και οι προαιρετικοί χώροι. Οι χώροι χρησιμοποιούν τον ποσοτικό κωδικό * (αστερίσκο ή αστερίσκο), που σημαίνει "μηδέν ή περισσότερο". Οποιοδήποτε στοιχείο που προηγείται αυτού θα ταιριάζει με μηδέν ή περισσότερες φορές. Για παράδειγμα, το regex /a*/ θα ταιριάζει με μια σειρά μηδέν ή περισσότερων χαρακτήρων 'α'.
#! / usr / bin / env ruby
str = "foo, bar, baz"
βάζει str.split (/, * /)
$ ./2.rb
foo
μπαρ
baz
Περιορισμός του αριθμού των χωρισμάτων
Φανταστείτε μια συμβολοσειρά τιμών διαχωρισμένη με κόμμα, όπως "10,20,30, Αυτή είναι μια αυθαίρετη σειρά". Αυτή η μορφή είναι τρεις αριθμοί που ακολουθείται από μια στήλη σχολίων. Αυτή η στήλη σχολίων μπορεί να περιέχει αυθαίρετο κείμενο, συμπεριλαμβανομένου κειμένου με κόμματα σε αυτό. Να αποτρέψω διαίρεση από τη διαίρεση του κειμένου αυτής της στήλης, μπορούμε να ορίσουμε έναν μέγιστο αριθμό των στηλών που θα χωριστούν.
Σημείωση: Αυτό θα λειτουργήσει μόνο αν η συμβολοσειρά σχόλιου με το αυθαίρετο κείμενο είναι η τελευταία στήλη του πίνακα.
Για να περιορίσετε τον αριθμό των διαχωρισμών που θα εκτελέσει η μέθοδος διαίρεσης, θα περάσει τον αριθμό των πεδίων στη συμβολοσειρά ως δεύτερο όρισμα στη μέθοδο διαίρεσης, όπως παρακάτω:
#! / usr / bin / env ruby
str = "10,20,30, δέκα, είκοσι και τριάντα"
βάζει str.split (/, * /, 4)
$ ./3.rb
10
20
30
Δέκα, είκοσι και τριάντα
Παράδειγμα μπόνους!
Τι κι αν θέλετε να χρησιμοποιήσετε διαίρεση για να πάρει όλα τα στοιχεία, αλλά το πρώτο;
Είναι πραγματικά πολύ απλό:
πρώτον, * υπόλοιπο = ex.split (/, /)
Γνωρίζοντας τους περιορισμούς
Η μέθοδος διαίρεσης έχει κάποιους μάλλον μεγάλους περιορισμούς.
Πάρτε για παράδειγμα το string '10, 20, 'Bob, Eve και Mallory', 30 '. Αυτό που προτίθεται είναι δύο αριθμοί, ακολουθούμενο από μια συμβαλλόμενη συμβολοσειρά (που μπορεί να περιέχει κόμματα) και έπειτα έναν άλλο αριθμό. Η διαίρεση δεν μπορεί να διαχωρίσει σωστά αυτήν την συμβολοσειρά σε πεδία.
Για να γίνει αυτό, πρέπει να είναι ο σαρωτής συμβολοσειρών κρατικό, που σημαίνει ότι μπορεί να θυμηθεί αν είναι μέσα σε μια συμβολοσειρά που αναγράφεται ή όχι. Ο χωρισμένος σαρωτής δεν είναι stateful, έτσι δεν μπορεί να λύσει προβλήματα όπως αυτό.