Comme vous le savez peut-être déjà, les chaînes Rubis sont ce qu'on appelle objets de première classe qui utilisent un certain nombre de méthodes pour les requêtes et la manipulation.
L'un des plus basiques manipulation de chaînes actions consiste à diviser une chaîne en plusieurs sous-chaînes. Cela serait fait, par exemple, si vous avez une chaîne comme"foo, bar, baz" et vous voulez les trois cordes "foo", "bar" et "baz". le Divisé La méthode de la classe String peut accomplir cela pour vous.
L'utilisation de base de "Split"
L'utilisation la plus élémentaire du Divisé consiste à fractionner une chaîne en fonction d'un seul caractère ou d'une séquence statique de caractères. Si le premier argument de split est une chaîne, les caractères de cette chaîne sont utilisés comme délimiteur de séparateur de chaînes, tandis que dans les données délimitées par des virgules, la virgule est utilisée pour séparer les données.
#! / usr / bin / env rubis
str = "foo, bar, baz"
met str.split (",")
$ ./1.rb
foo
bar
baz
Ajoutez de la flexibilité avec des expressions régulières
Il existe des moyens plus simples de délimiter chaîne. L'utilisation d'une expression régulière comme délimiteur rend la méthode de fractionnement beaucoup plus flexible.
Encore une fois, prenez par exemple la chaîne "foo, bar, baz". Il y a un espace après la première virgule, mais pas après la seconde. Si la chaîne "," est utilisée comme délimiteur, un espace existera toujours au début de la chaîne "bar". Si la chaîne "," est utilisée (avec un espace après la virgule), elle ne correspondra qu'à la première virgule car la deuxième virgule n'a pas d'espace après. C'est très limitant.
La solution à ce problème consiste à utiliser une expression régulière comme argument de délimitation au lieu d'une chaîne. Les expressions régulières vous permettent de faire correspondre non seulement des séquences statiques de caractères, mais aussi des nombres indéterminés de caractères et des caractères facultatifs.
Écrire des expressions régulières
Lorsque vous écrivez une expression régulière pour votre délimiteur, la première étape consiste à décrire en mots ce qu'est le délimiteur. Dans ce cas, l'expression "une virgule qui pourrait être suivie d'un ou plusieurs espaces" est raisonnable.
Il y a deux éléments dans cette expression régulière: la virgule et les espaces optionnels. Les espaces utiliseront le quantificateur * (étoile ou astérisque), ce qui signifie «zéro ou plus». Tout élément qui le précède correspondra à zéro ou plusieurs fois. Par exemple, l'expression régulière /a*/ correspondra à une séquence de zéro ou plusieurs caractères "a".
#! / usr / bin / env rubis
str = "foo, bar, baz"
met str.split (/, * /)
$ ./2.rb
foo
bar
baz
Limiter le nombre de divisions
Imaginez une chaîne de valeur séparée par des virgules telle que "10,20,30, il s'agit d'une chaîne arbitraire". Ce format est composé de trois chiffres suivis d'une colonne de commentaires. Cette colonne de commentaire peut contenir du texte arbitraire, y compris du texte avec des virgules. Pour prévenir Divisé en divisant le texte de cette colonne, nous pouvons définir un nombre maximum de colonnes à diviser.
Remarque: Cela ne fonctionnera que si la chaîne de commentaire avec le texte arbitraire est la dernière colonne du tableau.
Pour limiter le nombre de fractionnements que la méthode de fractionnement effectuera, transmettez le nombre de champs de la chaîne comme deuxième argument à la méthode de fractionnement, comme ceci:
#! / usr / bin / env rubis
str = "10,20,30, dix, vingt et trente"
met str.split (/, * /, 4)
$ ./3.rb
10
20
30
Dix, vingt et trente
Exemple de bonus!
Et si vous vouliez utiliser Divisé pour obtenir tous les articles, mais le tout premier?
C'est en fait très simple:
d'abord, * rest = ex.split (/, /)
Connaître les limites
La méthode de partage a quelques limitations assez importantes.
Prenons par exemple la chaîne '10, 20, "Bob, Eve et Mallory", 30 '. Ce qui est prévu, c'est deux nombres, suivis d'une chaîne entre guillemets (qui peut contenir des virgules), puis d'un autre nombre. Le fractionnement ne peut pas séparer correctement cette chaîne en champs.
Pour ce faire, le scanner de chaînes doit être avec état, ce qui signifie qu'il peut se souvenir s'il se trouve à l'intérieur d'une chaîne entre guillemets ou non. Le scanner divisé n'est pas avec état, il ne peut donc pas résoudre des problèmes comme celui-ci.