Ich möchte das letzte Vorkommen eines Teilstrings in Ruby ersetzen. Was ist der einfachste Weg? Zum Beispiel in abc123abc123, ich möchte die letzte abc zu ABC ersetzen. Wie kann ich das tun?Wie wird das letzte Vorkommen einer Teilkette in Ruby ersetzt?
Antwort
Wenn in riesigen Datenströme suchen, reverse
wird endgültig * führen zu Leistungsproblemen mit. Ich benutze string.rpartition
*:
sub_or_pattern = "!"
replacement = "?"
string = "hello!hello!hello"
array_of_pieces = string.rpartition sub_or_pattern
(array_of_pieces[(array_of_pieces.find_index sub_or_pattern)] = replacement) rescue nil
p array_of_pieces.join
# "hello!hello?hello"
Der gleiche Code muss ohne Vorkommen von sub_or_pattern
mit einem String arbeiten:
string = "hello_hello_hello"
# ...
# "hello_hello_hello"
* rpartition
verwendet rb_str_subseq()
intern. Ich habe nicht überprüft, ob diese Funktion eine Kopie der Zeichenkette zurückgibt, aber ich denke, sie behält den Teil des Speichers, der von diesem Teil der Zeichenkette verwendet wird, bei. reverse
verwendet rb_enc_cr_str_copy_for_substr()
, was darauf hindeutet, dass Kopien die ganze Zeit gemacht werden - obwohl vielleicht in Zukunft eine intelligentere String
Klasse implementiert werden könnte (mit einem Flag reversed
auf True gesetzt, und alle Funktionen rückwärts laufen, wenn das gesetzt ist), ab sofort ist es ineffizient.
Darüber hinaus Regex
Muster können nicht einfach umgekehrt werden.Die Frage fragt nur nach dem Ersetzen des letzten Vorkommens einer Teilzeichenfolge, also, das ist in Ordnung, aber Leser, die etwas robusteres benötigen, werden nicht von der am meisten gewählten Antwort profitieren (zum jetzigen Zeitpunkt)
Wie wäre es
new_str = old_str.reverse.sub(pattern.reverse, replacement.reverse).reverse
Zum Beispiel:
irb(main):001:0> old_str = "abc123abc123"
=> "abc123abc123"
irb(main):002:0> pattern="abc"
=> "abc"
irb(main):003:0> replacement="ABC"
=> "ABC"
irb(main):004:0> new_str = old_str.reverse.sub(pattern.reverse, replacement.reverse).reverse
=> "abc123ABC123"
"abc123abc123".gsub(/(.*(abc.*)*)(abc)(.*)/, '\1ABC\4')
#=> "abc123ABC123"
Aber wahrscheinlich gibt es eine bessere Art und Weise ...
Edit:
... die Chris freundlicherweise in dem Kommentar b zur Verfügung gestellt elow.
So, wie *
ein gieriger Operator ist, ist die folgende genug:
"abc123abc123".gsub(/(.*)(abc)(.*)/, '\1ABC\3')
#=> "abc123ABC123"
EDIT2:
Es ist auch eine Lösung, die ordentlich parallel Array Zuordnung in Ruby zeigt:
*a, b = "abc123abc123".split('abc', -1)
a.join('abc')+'ABC'+b
#=> "abc123ABC123"
Wegen der gierigen Übereinstimmung sollte nur 'str (/(.*) abc /, '\ 1ABC') ausreichen. –
Doh! Danke, ich habe die Antwort aktualisiert. –
Vielen Dank. Ich dachte auch, dass dieses Problem durch den regulären Ausdruck gelöst werden kann, aber ich weiß nicht wie. Du hast es geschafft. Danke noch einmal! –
string = "abc123abc123"
pattern = /abc/
replacement = "ABC"
matches = string.scan(pattern).length
index = 0
string.gsub(pattern) do |match|
index += 1
index == matches ? replacement : match
end
#=> abc123ABC123
Hier ist eine andere mögliche Lösung:
>> s = "abc123abc123"
=> "abc123abc123"
>> s[s.rindex('abc')...(s.rindex('abc') + 'abc'.length)] = "ABC"
=> "ABC"
>> s
=> "abc123ABC123"
einfach und effizient:
s = "abc123abc123abc"
p = "123"
s.slice!(s.rindex(p), p.size)
s == "abc123abcabc"
Dies beantwortet die Frage nicht. – aross
I '
def gsub_last(str, source, target)
return str unless str.include?(source)
top, middle, bottom = str.rpartition(source)
"#{top}#{target}#{bottom}"
end
Wenn Sie es mehr Rails-y, erweitern es auf der String-Klasse selbst machen wollen:
class String
def gsub_last(source, target)
return self unless self.include?(source)
top, middle, bottom = self.rpartition(source)
"#{top}#{target}#{bottom}"
end
end
Dann können Sie einfach es direkt anrufen dieses handliche Helfer-Methode ziemlich viel ve verwendet B. "fooBAR123BAR".gsub_last("BAR", "FOO") == "fooBAR123FOO"
Sie können dies erreichen mit gsub und gierig regexp .*
wie folgt aus:
'abc123abc123'.gsub(/(.*)abc/, '\1ABC')
- 1. rreplace - Wie wird das letzte Vorkommen eines Ausdrucks in einer Zeichenkette ersetzt?
- 2. Das letzte Vorkommen eines Elements in einer Liste finden Python
- 3. Warum wird in Ruby eine Zeichenfolge # ersetzt?
- 4. Wie das letzte Vorkommen eines Wortes in Javascript ersetzen?
- 5. Finde das letzte Vorkommen von Punkt mit Regex
- 6. Finde das letzte Vorkommen eines Zeichens in der Zeichenkette Python
- 7. Wie letzte Vorkommen von Zeichen in einer Zeichenfolge mit Javascript
- 8. das letzte Vorkommen eines Strings in Javascript Entfernen
- 9. Wie finde ich das letzte Vorkommen einer Teilzeichenkette in einer Swift-Zeichenkette? Ich
- 10. PHP Das letzte Vorkommen eines Strings in einem String ersetzen?
- 11. Python - wie das letzte Vorkommen Erfüllung einer bestimmten Bedingung aus einer Liste extrahieren
- 12. Wie wird der letzte Punkt in einer Zeichenfolge durch einen regulären Ausdruck ersetzt?
- 13. Bash: wie sed zu verwenden, um nur das letzte Vorkommen in einer Datei zu ersetzen?
- 14. Das erste Zeichen im Ausgabestream wird durch das letzte Zeichen dieses Streams ersetzt, das entfernt wird. Warum ist das so?
- 15. Scala: Entfernen Sie das letzte Vorkommen eines Zeichens
- 16. XSLT: Finding letzte Vorkommen in einem String
- 17. JavaScript: ersetzen letzte Vorkommen von Text in einem String
- 18. Warum ersetzt string.replace nur jedes zweite Vorkommen?
- 19. Ersetzen Sie das letzte Vorkommen von Speicherplatz durch sed
- 20. Wie das erste Vorkommen einer Klasse
- 21. Wie wird das letzte Zeichen einer Zeichenfolge unbekannter Länge extrahiert?
- 22. Finden Sie das letzte Vorkommen von Regex Word
- 23. Wie bekomme ich das letzte Element einer Sequenz in XPath?
- 24. In Typoskript ersetzt String.Replace nur das erste Vorkommen einer übereinstimmenden Zeichenfolge. String.replaceAll() -Methode
- 25. javascript .replace() ersetzt nicht jedes Vorkommen
- 26. Oracle PL/SQL: Split-String und erhalten letzte Teilkette begrenzt
- 27. JS alle Vorkommen der Zeichenkette ersetzt Variable
- 28. Warum ersetzt sed nicht alle Vorkommen?
- 29. Wie ersetzt man das Unicode-Juwel auf Ruby 1.9?
- 30. Wie ersetzt man alle Vorkommen einer Variablen in einer Zeichenkette mit Javascript?
Klare und einfache Antwort zu verstehen. –