logo ruby regex

logo - $ 1 y / 1 en Ruby



hbase (2)

/ 1 es una referencia inversa que solo funcionará en la misma llamada al método sub o gsub , por ejemplo:

"foobar".sub(/foo(.*)/, ''/1/1'') # => "barbar"

$ 1 es una variable global que se puede usar en códigos posteriores:

if "foobar" =~ /foo(.*)/ then puts "The matching word was #{$1}" end

Salida:

"The matching word was bar" # => nil

Al usar expresiones regulares en Ruby, ¿cuál es la diferencia entre $ 1 y / 1?


Tenga en cuenta que hay una tercera opción, la forma de bloque de sub . A veces lo necesitas. Digamos que quiere reemplazar algún texto con el reverso de ese texto. No puede usar $ 1 porque no está vinculado lo suficientemente rápido:

"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1, # or gives an error if $1 is unbound

Tampoco puede usar /1 , porque el sub simplemente hace una simple sustitución de texto de /1 con el texto capturado apropiado, no hay magia teniendo lugar aquí:

"foobar".sub(/(.*)/, ''/1''.reverse) # WRONG: returns ''1/'

Entonces, si desea hacer algo sofisticado, debe usar la forma de bloque de sub ($ 1, $ 2, $ `, $ '', etc. estarán disponibles):

"foobar".sub(/.*/){|m| m.reverse} # => returns ''raboof'' "foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns ''oofrab''