Πώς να χρησιμοποιήσετε την αντικατάσταση των συμβολοσειρών στο Ruby

click fraud protection

Διαίρεση μιας συμβολοσειράς είναι ένας μόνο τρόπος για να χειριστείτε τα δεδομένα συμβολοσειρών. Μπορείτε επίσης να κάνετε αντικαταστάσεις για να αντικαταστήσετε ένα τμήμα μιας συμβολοσειράς με μια άλλη συμβολοσειρά. Για παράδειγμα, σε μια συμβολοσειρά παράδειγμα (foo, bar, baz) αντικαθιστώντας το "foo" με το "boo" θα έδιναν "boo, bar, baz." Μπορείτε να το κάνετε αυτό και πολλά άλλα πράγματα χρησιμοποιώντας το υπο και gsub στην τάξη συμβολοσειρών.

Πολλές επιλογές για την αντικατάσταση του Ruby

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

Ενώ υπο αντικαθιστά μόνο το πρώτο στιγμιότυπο, το gsub μέθοδος αντικαθιστά κάθε εμφάνιση του σχεδίου με την αντικατάσταση. Επιπλέον, και οι δύο υπο και gsub έχω υπο! και gsub! ομόλογοί. Θυμηθείτε, οι μέθοδοι στο Ρουμπίνι αυτό το τέλος σε ένα θαυμαστικό μεταβάλλει τη μεταβλητή στη θέση του αντί να επιστρέψει ένα τροποποιημένο αντίγραφο.

instagram viewer

Αναζήτηση και αντικατάσταση

Η πιο βασική χρήση των μεθόδων υποκατάστασης είναι η αντικατάσταση μιας στατικής συμβολοσειράς αναζήτησης με μία στατική αλυσίδα αντικατάστασης. Στο παραπάνω παράδειγμα, ο όρος "foo" αντικαταστάθηκε με "boo". Αυτό μπορεί να γίνει για την πρώτη εμφάνιση του "foo" στη συμβολοσειρά χρησιμοποιώντας το υπο ή με όλες τις περιπτώσεις "foo" χρησιμοποιώντας το gsub μέθοδος.

#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
βάζει β
$ ./1.rb
foo, μπαρ, baz
gsub $ ./1.rb
boo, μπαρ, baz

Ευέλικτη αναζήτηση

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

Αυτό το παράδειγμα είναι λίγο πιο πραγματικό κόσμο. Φανταστείτε ένα σύνολο τιμών που χωρίζονται με κόμματα. Αυτές οι τιμές τροφοδοτούνται σε ένα πρόγραμμα χαρτογράφησης για το οποίο δεν έχετε κανένα έλεγχο (κλειστό πηγή). Το πρόγραμμα που παράγει αυτές τις τιμές είναι και κλειστή πηγή, αλλά εκπέμπει κάποια δεδομένα που είναι κακό μορφοποιημένα. Ορισμένα πεδία έχουν κενά μετά το κόμμα και αυτό προκαλεί σπάσιμο του προγράμματος tab.

Μια πιθανή λύση είναι να γράψετε ένα πρόγραμμα Ruby που να λειτουργεί ως "κόλλα" ή ένα φίλτρο μεταξύ των δύο προγραμμάτων. Αυτό το πρόγραμμα Ruby θα διορθώσει τυχόν προβλήματα στη μορφοποίηση δεδομένων, ώστε ο πίνακας να μπορεί να κάνει τη δουλειά του. Για να γίνει αυτό, είναι πολύ απλό: αντικαταστήστε ένα κόμμα ακολουθούμενο από έναν αριθμό κενών με ένα κόμμα.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
θέτει l
τέλος
gsub $ cat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ cat data.txt | ./2
10,20,30
12.8,10.4,11

Ευέλικτες αντικαταστάσεις

Τώρα φανταστείτε αυτή την κατάσταση. Εκτός από την ελάσσονα μορφοποίηση Σφάλματα, το πρόγραμμα που παράγει τα δεδομένα παράγει αριθμητικά δεδομένα σε επιστημονική σημείωση. Το πρόγραμμα tabator δεν το καταλαβαίνει, οπότε θα πρέπει να το αντικαταστήσετε. Προφανώς, ένα απλό gsub δεν θα κάνει εδώ, επειδή η αντικατάσταση θα είναι διαφορετική κάθε φορά που γίνεται η αντικατάσταση.

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

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/ -???
"% .3f"% n.to_f
τέλος
l.gsub! (/, + /, ",")
θέτει l
τέλος
gsub $ cat floatdata.txt
2.215e-1, 54, 11
3.15668e6, 21, 7
gsub $ cat floatdata.txt ./3.rb
0.222,54,11
3156680.000,21,7

Δεν είναι εξοικειωμένοι με τις κανονικές εκφράσεις;

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

Το κύριο στοιχείο εδώ είναι το \ρε κατηγορίας χαρακτήρων. Αυτό θα αντιστοιχεί σε οποιοδήποτε ψηφίο, στους χαρακτήρες 0 έως 9. Ο μετρητής + χρησιμοποιείται με την τάξη χαρακτήρων ψηφίων για να υποδηλώσει ότι ένα ή περισσότερα από αυτά τα ψηφία πρέπει να αντιστοιχίζονται σε μια σειρά. Έχετε τρεις ομάδες ψηφίων, δύο χωρισμένες από ένα "."και το άλλο χωρίζεται από το γράμμα"μι"(για τον εκθέτη).

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

Τα δύο άλλα στοιχεία είναι τα. (περίοδος) και το μι χαρακτήρας. Συνδυάστε όλα αυτά και παίρνετε μια κανονική έκφραση (ή σύνολο κανόνων για αντιστοίχιση κειμένου) που αντιστοιχεί σε αριθμούς σε επιστημονική μορφή (όπως π.χ. 12.34e56).

instagram story viewer