Πώς να διαχωρίσετε τις χορδές στο Ruby

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

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

Πώς λειτουργεί το String # split

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

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

#! / usr / bin / env ruby
print "Ποιο είναι το πλήρες όνομά σας; "
full_name = get.chomp
όνομα = full_name.split ('')
instagram viewer

θέτει "Το πρώτο σας όνομα είναι # {name.first}"
βάζει "Το επώνυμό σας είναι # {name.last}"

Εάν εκτελέσουμε αυτό το πρόγραμμα και εισάγουμε ένα όνομα, θα έχουμε κάποια αναμενόμενα αποτελέσματα. Επίσης, σημειώστε ότι ΟΝΟΜΑ πρώτα και name.last είναι συμπτώσεις. ο όνομα η μεταβλητή θα είναι μια Πίνακας, και αυτές οι δύο κλήσεις μεθόδου θα είναι ισοδύναμες με όνομα [0] και όνομα [-1] αντίστοιχα.

$ ruby ​​split.rb
Ποιο είναι το πλήρες όνομά σου? Michael C. Morin
Το πρώτο σας όνομα είναι ο Μιχαήλ
Το επώνυμό σας είναι ο Morin

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

Έτσι, αν θέλαμε να του δώσουμε κάποιες ελαφρώς παραμορφωμένες εισόδους, όπως

Michael C. Morin

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

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

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

Έτσι, μπορούμε να εξελίξουμε το παράδειγμά μας λίγο:

$ cat split.rb
#! / usr / bin / env ruby
print "Ποιο είναι το πλήρες όνομά σας; "
full_name = get.chomp
όνομα = full_name.split (/ \.? \ s + /)
θέτει "Το πρώτο σας όνομα είναι # {name.first}"
θέτει "Η μέση αρχική σας είναι # {name [1]}"
βάζει "Το επώνυμό σας είναι # {name.last}"

Προεπιλεγμένος διαχωριστής εγγραφών

Ρουμπίνι δεν είναι πραγματικά μεγάλο σε "ειδικές μεταβλητές" που μπορεί να βρείτε σε γλώσσες όπως Perl, αλλά Η συμβολοσειρά # χωρίζεται χρησιμοποιεί ένα που πρέπει να γνωρίζετε. Αυτή είναι η προεπιλεγμένη μεταβλητή διαχωριστή εγγραφών, επίσης γνωστή ως $;.

Είναι ένα σφαιρικό, κάτι που δεν βλέπετε συχνά στο Ruby, οπότε αν το αλλάξετε, μπορεί να επηρεάσει και άλλα τμήματα του κώδικα - φροντίστε να το αλλάξετε πάλι όταν τελειώσετε.

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

Διαχωριστές μηδενικού μήκους

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

Αυτό μπορεί να είναι χρήσιμο για την εξάσκηση πάνω από το string και χρησιμοποιήθηκε σε προ-1.9.x και pre-1.8.7 αριθμός χαρακτηριστικών από το 1.9.x) έως την επανάληψη χαρακτήρων σε μια συμβολοσειρά χωρίς να ανησυχείτε για τη διάσπαση πολυ-byte Χαρακτήρες Unicode. Ωστόσο, εάν αυτό που πραγματικά θέλετε να κάνετε είναι να επαναλάβετε μια συμβολοσειρά και χρησιμοποιείτε το 1.8.7 ή το 1.9.x, θα πρέπει πιθανώς να χρησιμοποιήσετε String # each_char αντι αυτου.

#! / usr / bin / env ruby
str = "Με έστρεψε σε νεωτερισμό!"
str.split (''), το καθένα κάνει | c |
βάζει c
τέλος

Περιορισμός του μήκους του επιστρεφόμενου πίνακα

Επιστρέψτε στο παράδειγμά μας για παράδειγμα, αν κάποιος έχει ένα κενό διάστημα στο επώνυμό του; Για παράδειγμα, τα ολλανδικά επώνυμα μπορούν συχνά να αρχίσουν με "van" (που σημαίνει "του" ή "από").

Θέλουμε μόνο ένα 3-στοιχείο πίνακας, ώστε να μπορέσουμε να χρησιμοποιήσουμε το δεύτερο επιχείρημα Η συμβολοσειρά # χωρίζεται που μέχρι τώρα αγνοήσαμε. Το δεύτερο επιχείρημα αναμένεται να είναι α Fixnum. Εάν αυτό το επιχείρημα είναι θετικό, το πολύ, πολλά στοιχεία θα συμπληρωθούν στη συστοιχία. Έτσι, στην περίπτωσή μας, θα θέλαμε να περάσουμε 3 για αυτό το επιχείρημα.

#! / usr / bin / env ruby
print "Ποιο είναι το πλήρες όνομά σας; "
full_name = get.chomp
όνομα = full_name.split (/ \.? \ s + /, 3)
θέτει "Το πρώτο σας όνομα είναι # {name.first}"
θέτει "Η μέση αρχική σας είναι # {name [1]}"
βάζει "Το επώνυμό σας είναι # {name.last}"

Αν το τρέξουμε ξανά και θα του δώσουμε ολλανδικό όνομα, θα ενεργήσει όπως αναμένεται.

$ ruby ​​split.rb
Ποιο είναι το πλήρες όνομά σου? Vincent Willem van Gogh
Το πρώτο σας όνομα είναι ο Vincent
Το μεσαίο σας αρχικό είναι ο Willem
Το επώνυμό σας είναι ο van Gogh

Ωστόσο, αν αυτό το επιχείρημα είναι αρνητικό (οποιοσδήποτε αρνητικός αριθμός), τότε δεν θα υπάρχει όριο στον αριθμό των τα στοιχεία στη συστοιχία εξόδου και οι όποιες οριοθετητές θα εμφανιστούν ως συμβολοσειρές μηδενικού μήκους στο τέλος του πίνακας.

Αυτό αποδεικνύεται σε αυτό το απόσπασμα IRB:

: 001> "αυτό είναι, ένα, δοκιμή" .split (',' -1)
=> ["αυτό", "είναι", "α", "δοκιμή", "", "", ""