Al usar expresiones regulares en Ruby, ¿cuál es la diferencia entre $ 1 y \ 1?
Respuesta
\ 1 es una referencia hacia atrás, que sólo funcionará en el mismo sub
o gsub
llamada a un método, por ejemplo:
"foobar".sub(/foo(.*)/, '\1\1') # => "barbar"
$ 1 es una variable global que se puede utilizar en código más tarde:
if "foobar" =~ /foo(.*)/ then
puts "The matching word was #{$1}"
end
Salida:
"The matching word was bar"
# => nil
Tenga en cuenta que hay una tercera opción, la b forma de bloqueo de sub
. A veces lo necesitas. Digamos que quiere reemplazar algún texto con el reverso de ese texto. No se puede utilizar $ 1 porque no está obligado con la suficiente rapidez:
"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1,
# or gives an error if $1 is unbound
Tampoco se puede utilizar \1
, ya que el método sub
sólo lo hace un simple texto de sustitución de \1
con el texto apropiado capturado, no hay magia teniendo lugar aquí:
"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\'
Así que si quieres hacer algo de fantasía, se debe utilizar la forma de bloques de sub
($ 1, $ 2, $ ', $', etc. estarán disponibles):
"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof'
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'
Su ejemplo podría ser engañoso: la coincidencia es lo que se transfiere al bloque, no los grupos de coincidencia. Entonces, si quisieras cambiar "foobar" por "foorab", tendrías que hacer 'str.sub (/ (foo) (\ w +) /) {$ 1 + $ 2.reverse}' – rampion
Ver ri String # sub : En el formulario de bloque, la cadena de coincidencia actual se pasa como un parámetro , y variables como $ 1, $ 2, $ ', $ & y $ 'serán configuradas apropiadamente. El valor devuelto por el bloque será sustituido por la coincidencia en cada llamada. – rampion
Derecha, voy a editar para aclararlo. –
- 1. Ruby: ¿Qué significa $ 1?
- 2. ¿Por qué 0 && 1 es 1 mientras que 1 && 0 es 0 en ruby?
- 3. Haskell: Equation Expander 1+ (1+ (1+ (1+ (...)))) = ∞
- 4. ¿Por qué -1 >> 1 es -1? ¡Y 1 >> 1 es 0!
- 5. 1 + 1/2 + 1/3 + --- + 1/n =?
- 6. ¿Qué significa 1. # INF00, -1. # IND00 y -1. # IND significa?
- 7. En Ruby, 12.months! = 1.year
- 8. (-1 >> 1) == -1 - ¿Por qué?
- 9. ¿Cuál es la diferencia entre 1 y '1 en Lisp?
- 10. ¿Qué significan -1, 1 y 0 en este código Javascript?
- 11. En Javascript, ¿por qué {a: 1} == {a: 1} da un error, y ({a: 1}) == {a: 1} funcionará?
- 12. Diccionario bidireccional 1 a 1 en C#
- 13. Diferencia entre $ 1 vs% 1 en .htaccess
- 14. x = y = 1 en Scala?
- 15. En Javascript, ¿por qué [1, 2] == [1, 2] o ({a: 1}) == ({a: 1}) es falso?
- 16. SELECCIONAR 1 = 1 no funciona
- 17. ¿Qué significa "- [1,]" en "if (! - [1,] &&! Window.XMLHttpRequest)"?
- 18. "(1..4) .inject (y +)" trabajo en Rubí
- 19. "SELECCIONAR SUPERIOR 1 1" VS "SI EXISTE (SELECCIONAR 1"
- 20. Haskell: Datastruture con O (1) anexión y O (1) indización?
- 21. Obtener un valor doble aleatorio entre -1 y 1
- 22. Compara dos números y devuelve -1, 0 o 1
- 23. Transformar [: uno, 1,: dos, 2] a {: uno => 1,: dos => 2} en Ruby
- 24. Ruby whitespace: ¿Es {: a => 1} mejor que {: a => 1}?
- 25. ASP.NET: Obtenga milisegundos desde 1/1/1970
- 26. Normalizando de [0.5 - 1] a [0 - 1]
- 27. rendimiento entre varchar (1) vs char (1)
- 28. T-SQL 1 = 1 Rendimiento Hit
- 29. Obtener MD5 y SHA-1
- 30. ¿Qué significa "$ 1/*" en "para archivo en $ 1/*"
Tenga en cuenta que [el tratamiento de Ruby de las comillas simples versus las dobles] (http://stackoverflow.com/a/3028799/303896) puede interponerse en su camino al intentar usar referencias retrospectivas. – alxndr
no entendí mucho, ¿puede alguien dar alguna explicación más? – YasirAzgar
@YasirAzgar '.sub()' es una llamada a un método. ''\ 1'' puede (aparentemente) usarse solo dentro del alcance de una llamada a un método' sub' o 'gsub'. En el primer ejemplo, '" foobar ".sub (/ foo (. *) /, '\ 1 \ 1')', ''\ 1'' está dentro del alcance del método' sub'. En el segundo ejemplo, '$ 1' se referencia fuera de un método' sub'/'gsub'. El ejemplo muestra que se hace referencia poco después de una llamada '= ~', pero eso es irrelevante. Aparentemente, el uso de una expresión regular establece '$ 1', que, como variable global, se puede referenciar en cualquier lugar. – John