1
votes

Remplacer plusieurs mots différents dans la chaîne

J'ai une chaîne en Ruby:

The animal_name is located in the some_place 

Comment remplacer animal_name par "fish" et some_place par "lake"

J'ai utilisé phrase.sub! 'animal_name', 'fish' qui fonctionne très bien pour un mot mais je n'ai droit qu'à 2 paramètres, donc je ne peux pas changer différents types de mots en même temps.

Je veux faire quelque chose comme:

phrase.sub! ('animal_name' => 'fish', 'some_place' => 'lake')

Des idées sur la façon de procéder?


1 commentaires

Je crois que l'utilisation de gsub par @ steenslag avec un hachage est la manière normale d'effectuer les substitutions souhaitées.


3 Réponses :


2
votes

Vous pouvez utiliser gsub ( documents ici ) en fournissant un bloc, où vous décidez quelle est la bonne valeur pour remplacer chacun des mots:

sentence = 'The animal_name is located in the some_place'
mapping = {'animal_name' => 'fish', 'some_place' => 'lake'}
sentence.gsub(/#{mapping.keys.join('|')}/){|w| mapping[w]}

qui renvoie Le poisson est situé dans le lac .


0 commentaires

3
votes

C'est parce que sub! peut être appelé de trois manières:

p 'The animal_name is located in the some_place'.gsub(/\b\w+_.*?\b/, 'animal_name' => 'fish', 'some_place' => 'lake')
# "The fish is located in the lake"

Mais vous n'utilisez aucun de ces formulaires. Vous ne passez que le hachage, vous avez donc toujours besoin du modèle pour cela.

Mais cela ne fonctionnera pas comme prévu car sub remplace uniquement la première correspondance modèle:

À partir de la documentation:
Renvoie une copie de str avec la première occurrence de motif remplacé par le deuxième argument.

Vous pouvez donc essayer d'utiliser gsub à la place (ou gsub! ), mais toujours en passant le modèle:

sub(pattern, replacement) → new_str
sub(pattern, hash) → new_str
sub(pattern) {|match| block } → new_str 


0 commentaires

2
votes

Regexp # union est bien pour fournir un modèle:

sentence = 'The animal_name is located in the some_place'
mapping = {'animal_name' => 'fish', 'some_place' => 'lake'}

p sentence.gsub(Regexp.union(mapping.keys), mapping)


1 commentaires

Une variante est map = mapping.tap {| map | map.default_proc = -> (h, k) {k}}; phrase.gsub (/ \ S + /, carte) .