Bei Verwendung regulärer Ausdrücke in Ruby, was ist der Unterschied zwischen $ 1 und \ 1?
Antwort
\ 1 ist ein Rückreferenzierung, die nur in der gleichen sub
oder gsub
Methodenaufruf, zB funktioniert:
"foobar".sub(/foo(.*)/, '\1\1') # => "barbar"
$ 1 ist eine globale Variable, die in späteren Code verwendet werden können:
if "foobar" =~ /foo(.*)/ then
puts "The matching word was #{$1}"
end
Ausgang:
"The matching word was bar"
# => nil
Denken Sie daran, es gibt eine dritte Option, die b Schlossform von sub
. Manchmal brauchst du es. Angenommen, Sie möchten einen Text durch die Rückseite dieses Textes ersetzen. Sie können nicht mehr als $ 1 Verwenden, weil es nicht schnell genug gebunden ist:
"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1,
# or gives an error if $1 is unbound
Sie auch nicht \1
verwenden können, weil die sub
Methode hat nur eine einfache Text-Substitution von \1
mit dem entsprechenden erfassten Text, gibt es keine Magie hier stattfindet:
"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\'
Also, wenn Sie etwas Besonderes machen wollen, sollten Sie die Blockform sub
($ 1, $ 2, $ `, $‘ usw. verfügbar sein wird) verwenden:
"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof'
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'
Ihr Beispiel könnte irreführend sein - die Übereinstimmung wird an den Block weitergegeben, nicht an die Matchgroups. Wenn Sie also "foobar" in "foorab" ändern möchten, müssten Sie "str" (/ (foo) (\ w +) /) {$ 1 + $ 2.Reverse} ' – rampion
Siehe ri String # sub : In der Blockform wird die aktuelle Match-Zeichenfolge als Parameter übergeben, und Variablen wie $ 1, $ 2, $ ', $ &, und $ werden entsprechend festgelegt. Der Wert, der vom Block zurückgegeben wird, wird für die Übereinstimmung bei jedem Aufruf ersetzt. – rampion
Richtig, ich werde bearbeiten, um es zu löschen. –
- 1. Ruby: gets.chomp 1 Tastendruck
- 2. In Ruby, warum bewertet Nil [1] = 1 zu Null?
- 3. Unterschied zwischen + = -1 und - = 1 in Javascript
- 4. Was ist $ _ [0], $ _ [1] in Ruby?
- 5. Ich erwarte 1-zu-viele aber 1-1 1-1.
- 6. In Ruby, 12.Monate! = 1.Jahr
- 7. Was bedeuten 1. # INF00, -1. # IND00 und -1. # IND?
- 8. Entity Framework 1-To- * und 1-zu-1-
- 9. string index matching alternate 1 und -1
- 10. Konvertieren (0,1,0, 0, 1, 1, 1) zu (0, 0, 0, 1, 0, 1, 2) in R
- 11. NodeJS - Assoziationen 1: 1
- 12. Richtig verbinden 1: n: 1: 1 Beziehung in Mysql Datenbank
- 13. eine zufällige Doppel zwischen -1 und 1 in Swift
- 14. Was ist der Unterschied zwischen (1,) und (1) in Python
- 15. Ruby auf Schienen Identifier Fehler 1
- 16. Ist! 0 und! 1 besser als 1 und 0?
- 17. 1: 1-Beziehung in Laravel speichern
- 18. WCF 1 Session = 1 Thema?
- 19. SELECT 1 = 1 funktioniert nicht
- 20. Was ist der Unterschied zwischen 1..5, [* 1..5] und [1..5] in Groovy?
- 21. Mysql Berechnungsprobleme: 1 + 1 = 1.999999999
- 22. PHP MySQL in Klasse 1 & 1 Datei
- 23. Was bedeutet "- [1,]" in "if (! - [1,] &&! Window.XMLHttpRequest)"?
- 24. Was ist der Unterschied zwischen if (x^1! = 1) und if (int (x^1)! = 1) in C++?
- 25. Was ist die Funktion in Ruby, die "p * 1..10" erlaubt, die Zahlen 1-10 auszudrucken?
- 26. JPA Ruhezustand 1: 1-Beziehung
- 27. Transform [: eins, 1,: zwei, 2] zu {: eins => 1,: zwei => 2} in Ruby
- 28. Warum funktioniert s [len (s) -1: -1: -1] nicht?
- 29. CGColor nicht für die UIColor UIDeviceRGBColorSpace 1 1 0 1
- 30. "SELECT TOP 1 1" VS "IF EXISTS (SELECT 1"
Beachten Sie, dass [Rubys Behandlung von einfachen und doppelten Anführungszeichen] (http://stackoverflow.com/a/3028799/303896) Ihnen beim Versuch, Rückreferenzen zu verwenden, in die Quere kommen kann. – alxndr
habe nicht viel verstanden, kann jemand bitte etwas mehr Erklärung liefern – YasirAzgar
@ YasirAzgar '.sub()' ist ein Methodenaufruf. '\ 1'' kann (scheinbar) nur im Rahmen eines Aufrufs 'sub' oder' gsub' verwendet werden. Im ersten Beispiel liegt "foobar" .sub (/ foo (. *) /, '\ 1 \ 1') ',' '\ 1'' im Bereich der 'sub'-Methode. Im zweiten Beispiel wird "$ 1" außerhalb einer "sub"/"gsub" -Methode referenziert. Das Beispiel zeigt, dass es kurz nach einem '= ~ '- Aufruf referenziert wird, aber das ist irrelevant. Anscheinend setzt die Verwendung einer Regex '$ 1', die als globale Variable überall referenziert werden kann. – John