Wie man Rückreferenzen in gsub-Ersatzzeichenfolgen entkommt

Gibt es eine Alternative zu gsub, die gerade ein Zeichenfolgenvorkommen durch ein anderes ersetzt?

Laut Dokumentation "Wenn er eine Zeichenfolge ersetzt, wird er durch den übereinstimmenden Text ersetzt. Er kann Rückverweise auf die Erfassungsgruppen des Musters in der Form \ d enthalten, wobei d eine Gruppennummer oder \ k ist, wobei n für a steht Gruppenname."

Ich will diese Funktionalität nicht ..

vereinfachtes Beispiel:

"abc".gsub("b", "\\7") -> "ac"

und ich möchte "a \ 7c" ..

The problem is that the replacement string is asked from the user (actually it's a path that containts "xxx\7.0\yyy"), if it's simple a fixed string I could escape it myself.

Ich weiß, dass das funktioniert: "abc" .gsub ("b") {| x | "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\` .. ich glaube jedoch

3
hinzugefügt bearbeitet
Ansichten: 1
Das wird den ersten Vorfall ersetzen, wie bei sub .. aber ich brauche gsub (replace all).
hinzugefügt der Autor pragmatic_programmer, Quelle
Nicht sicher, ob du das willst (wenn ja, kann ich das als Antwort posten): s = 'abc'; s ['b'] = '\ 7.0'; s .
hinzugefügt der Autor polarblau, Quelle

2 Antworten

You can use (edit: no you can't) Regexp.escape to escape user-provided strings:

user_input = '\7'
puts "abc".gsub("b", Regexp.escape(user_input))
a\7c

Ansonsten mit einfachen Anführungszeichen anstelle von double:

puts "abc".gsub("b", '\\\7')
a\7c

... oder mit doppelten Anführungszeichen brauchen Sie nur mehr Entkommen:

puts "abc".gsub("b", "\\\\7")
a\7c

... oder Blocknotation, aber Sie können die Blockvariable einfach überspringen:

puts "abc".gsub("b") { '\7' }
a\7c
6
hinzugefügt
das funktioniert nicht: puts "abc" .gsub ("b", Regexp.escape ('\ 7.0')) >> a \ 7 \ .0c da ist ein weiterer Backslash hinzugefügt Ich weiß nicht warum ...
hinzugefügt der Autor pragmatic_programmer, Quelle
@pragmatic_programmer - Sie haben Recht. Mein Fehler. Sie können in diesem Fall Regexp.escape nicht verwenden. Es wird nicht funktionieren. Für Ihren Fall bleibt nur die letzte Option (Blocknotation) oder qdiesels Antwort übrig.
hinzugefügt der Autor Casper, Quelle
@pragmatic_programmer - Eine weitere Möglichkeit besteht darin, die Escapes mit einem anderen gsub zu umgehen, aber das sieht ziemlich hässlich aus. Sie würden also Folgendes tun: gsub ("b", user_input.gsub ('\\', '\\\\\\')) .
hinzugefügt der Autor Casper, Quelle
Ich wurde von \ gebissen. Option # 4 ist die Lösung.
hinzugefügt der Autor akostadinov, Quelle
Blocknotation sieht definitiv besser aus als meine Lösung
hinzugefügt der Autor qdiesel, Quelle
drei ist fehleranfällig. Wenn das folgende Zeichen \ oder ' ist, müssen Sie es erneut entfernen. Benutze einfach 4 \.
hinzugefügt der Autor Ian Yang, Quelle
$ irb 
irb(main):001:0> replace='xxx\7.0\yyy'
=> "xxx\\7.0\\yyy"
irb(main):002:0> puts  "abc".gsub("b", replace.dump[1..-2])
axxx\7.0\yyyc
=> nil
1
hinzugefügt
Es funktioniert .. aber die [1 ..- 2] sieht ziemlich kryptisch aus. Die Blocknotation ist klarer. Dies ist das erste Mal, dass ruby mich überrascht!
hinzugefügt der Autor pragmatic_programmer, Quelle