web-dev-qa-db-fra.com

Ruby remplace la chaîne par le motif 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 replace 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 }
110
JD Isaacks

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

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

Mais comme vous semblez ne vous intéresser qu'au groupe de capture, notez que vous pouvez indexer une chaîne avec une regex:

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

\1 entre guillemets doubles 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 écrit "S'il s'agit d'une chaîne entre guillemets doubles, les deux références arrière doivent être précédées d'une barre oblique inverse supplémentaire."

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

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

ou

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

Notez que le (?=:) est un groupe sans capture, de sorte que le : n'apparaît pas dans votre match.

35
Mark Thomas
 "foobar".gsub(/(o+)/){|s|s+'ball'}
 #=> "fooballbar"
11
gaurav.singharoy

Si vous devez utiliser une expression rationnelle pour filtrer certains résultats et utiliser ensuite uniquement le groupe de capture, vous pouvez procéder comme suit:

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"
4
grumpit
def get_code(str)
  str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"
1
maerics