Comment utiliser la substitution de chaînes dans Ruby

click fraud protection

Fractionner une chaîne n'est qu'une façon de manipuler les données de chaîne. Vous pouvez également effectuer des substitutions pour remplacer une partie d'une chaîne par une autre chaîne. Par exemple, dans un exemple de chaîne (foo, bar, baz), remplacer "foo" par "boo" dans donnerait "boo, bar, baz". Vous pouvez faire cela et bien d'autres choses en utilisant le sous et gsub dans la classe de chaîne.

De nombreuses options pour la substitution Ruby

Les méthodes de substitution se déclinent en deux variétés. le sous La méthode est la plus élémentaire des deux et comporte le moins de surprises. Il remplace simplement la première instance du modèle désigné par le remplacement.

Tandis que sous remplace uniquement la première instance, la gsub La méthode remplace chaque instance du modèle par le remplacement. De plus, les deux sous et gsub avoir sous! et gsub! homologues. Rappelez-vous, les méthodes Rubis cette fin dans un point d'exclamation modifie la variable en place au lieu de renvoyer une copie modifiée.

instagram viewer

Rechercher et remplacer

L'utilisation la plus élémentaire des méthodes de substitution consiste à remplacer une chaîne de recherche statique par une chaîne de remplacement statique. Dans l'exemple ci-dessus, "foo" a été remplacé par "boo". Cela peut être fait pour la première occurrence de "foo" dans la chaîne en utilisant le sous ou avec toutes les occurrences de "foo" en utilisant le gsub méthode.

#! / usr / bin / env rubis
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
met b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boo, bar, baz

Recherche flexible

La recherche de chaînes statiques ne peut aller jusque-là. Finalement, vous rencontrerez des cas où un sous-ensemble de cordes ou les chaînes avec des composants optionnels devront être appariées. Les méthodes de substitution peuvent, bien sûr, correspondre à des expressions régulières au lieu de chaînes statiques. Cela leur permet d'être beaucoup plus flexible et de correspondre à pratiquement n'importe quel texte dont vous pouvez rêver.

Cet exemple est un peu plus réel. Imaginez un ensemble de valeurs séparées par des virgules. Ces valeurs sont introduites dans un programme de tabulation sur lequel vous n'avez aucun contrôle (fermé la source). Le programme qui génère ces valeurs est également une source fermée, mais il génère des données mal formatées. Certains champs ont des espaces après la virgule et cela provoque la rupture du programme de tabulation.

Une solution possible consiste à écrire un programme Ruby pour agir comme «colle» ou filtre entre les deux programmes. Ce programme Ruby résoudra tous les problèmes de formatage des données afin que la tabulatrice puisse faire son travail. Pour ce faire, c'est assez simple: remplacez une virgule suivie par un certain nombre d'espaces par juste une virgule.

#! / usr / bin / env rubis
STDIN.chaque do | l |
l.gsub! (/, + /, ",")
met l
fin
gsub $ cat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ cat data.txt | ./2.rb
10,20,30
12.8,10.4,11

Remplacements flexibles

Imaginez maintenant cette situation. En plus du formatage mineur les erreurs, le programme qui produit les données produit des données numériques en notation scientifique. Le programme de tabulation ne comprend pas cela, vous devrez donc le remplacer. De toute évidence, un simple gsub ne fera pas l'affaire car le remplacement sera différent à chaque fois que le remplacement est effectué.

Heureusement, les méthodes de substitution peuvent prendre un bloc pour les arguments de substitution. Pour chaque fois que la chaîne de recherche est trouvée, le texte correspondant à la chaîne de recherche (ou expression régulière) est transmis à ce bloc. La valeur fournie par le bloc est utilisée comme chaîne de substitution. Dans cet exemple, un nombre à virgule flottante sous forme de notation scientifique (tel que 1.232e4) est converti en un nombre normal avec un point décimal. La chaîne est convertie en un nombre avec to_f, puis le nombre est formaté à l'aide d'une chaîne de format.

#! / usr / bin / env rubis
STDIN.chaque do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) faire | n |
"% .3f"% n.to_f
fin
l.gsub! (/, + /, ",")
met l
fin
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

Vous ne connaissez pas les expressions régulières?

Prenons un peu de recul et regardons cela expression régulière. Cela semble cryptique et compliqué, mais c'est très simple. Si vous n'êtes pas familier avec les expressions régulières, elles peuvent être assez cryptiques. Cependant, une fois que vous les connaissez, ce sont des méthodes simples et naturelles pour décrire le texte. Il y a un certain nombre d'éléments et plusieurs d'entre eux ont des quantificateurs.

L'élément principal ici est le \ré classe de caractères. Cela correspondra à n'importe quel chiffre, les caractères 0 à 9. Le quantificateur + est utilisé avec la classe de caractères numériques pour signifier qu'un ou plusieurs de ces chiffres doivent être mis en correspondance dans une rangée. Vous avez trois groupes de chiffres, deux séparés par un "."et l'autre séparé par la lettre"e"(pour l'exposant).

Le deuxième élément flottant est le caractère moins, qui utilise le "?"quantificateur. Cela signifie «zéro ou un» de ces éléments. Donc, en bref, il peut y avoir ou non des signes négatifs au début du nombre ou de l'exposant.

Les deux autres éléments sont les. (point) et le caractère e personnage. Combinez tout cela et vous obtenez une expression régulière (ou un ensemble de règles pour faire correspondre le texte) qui correspond aux nombres sous forme scientifique (tels que 12.34e56).

instagram story viewer