Ruby remplace la chaîne avec le motif de regex capturé

J’ai du mal à traduire cela en Ruby.

Voici un morceau de JavaScript qui fait exactement ce que je veux faire:

function get_code(str){ return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​; } 

J’ai essayé gsub , sub et remplacer, mais aucun ne semble faire ce que j’attendais.

Voici des exemples de choses que j’ai essayées:

 "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { |capture| capture } "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "$1") "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "#{$1}") "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\1") "Z_sdsd: sdsd".gsub(/(.).*/) { |capture| capture } 

Essayez '\1' pour le remplacement ( les guillemets simples sont importants, sinon vous devez échapper au \ ):

 "foo".gsub(/(o+)/, '\1\1\1') #=> "foooooo" 

Mais comme vous semblez seulement intéressé par le groupe de capture, notez que vous pouvez indexer une chaîne avec une expression régulière:

 "foo"[/oo/] #=> "oo" "Z_123: foobar"[/^Z_.*(?=:)/] #=> "Z_123" 

\1 entre guillemets doit être échappé. Donc, vous voulez soit

 "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1") 

ou

 "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1') 

voir la documentation sur gsub où il est dit “S’il s’agit d’une chaîne entre guillemets, les deux références doivent être précédées d’une barre oblique inverse supplémentaire.”

Cela étant dit, si vous voulez juste le résultat du match, vous pouvez faire:

 "Z_sdsd: sdsd".scan(/^Z_.*(?=:)/) 

ou

 "Z_sdsd: sdsd"[/^Z_.*(?=:)/] 

Notez que le (?=:) est un groupe non capturé de sorte que le : ne s’affiche pas dans votre correspondance.

  "foobar".gsub(/(o+)/){|s|s+'ball'} #=> "fooballbar" 

Si vous devez utiliser une expression régulière pour filtrer certains résultats, puis utiliser uniquement le groupe de capture, vous pouvez effectuer les opérations suivantes:

 str = "Leesburg, Virginia 20176" state_regex = Regexp.new(/,\s*([A-Za-z]{2,})\s*\d{5,}/) # looks for the comma, possible whitespace, captures alpha, # looks for possible whitespace, looks for zip > str[state_regex] => ", Virginia 20176" > str[state_regex, 1] # use the capture group => "Virginia" 
 def get_code(str) str.sub(/^(Z_.*): .*/, '\1') end get_code('Z_foo: bar!') # => "Z_foo"