In Wie machen Ich beschränke die Anzahl der Ersetzungen bei der Verwendung von gsub? , jemand schlug den folgenden Weg vor, um eine begrenzte Anzahl von Ersetzungen zu machen:
%Vor% Es funktioniert, aber der Code mischt, wie oft (5) mit dem ersetzt werden soll, was die Substitution sein soll ("x", wenn es eine Substitution geben sollte, sonst $&
). Ist es möglich, die beiden zu trennen?
(Wenn es zu schwierig ist, die beiden Dinge in diesem Szenario zu trennen, aber in einigen anderen Szenarien, kann man das als Antwort schreiben)
Wie wäre es, die Ersetzung einfach als Argument zu extrahieren und den Zähler einzukapseln, indem der Block innerhalb einer Methode geschlossen wird?
%Vor%Sie können es noch allgemeiner machen, indem Sie einen Block für die Ersetzung verwenden:
%Vor%Jetzt kannst du Sachen wie
machen %Vor% gsub
wird den Block genau so oft aufrufen, wie die Regex mit der Zeichenfolge übereinstimmt. Die einzige Möglichkeit, dies zu verhindern, besteht darin, break
im Block aufzurufen, was jedoch dazu führt, dass gsub
keinen aussagekräftigen Rückgabewert liefert.
Also nein, es sei denn, Sie rufen den Break im Block auf (wodurch verhindert wird, dass weiterer Code in der Yield-Methode ausgeführt wird und somit verhindert, dass die Methode irgendeinen Wert zurückgibt), die Anzahl der Aufrufe einer Methode durch die Methode selbst. Wenn Sie gsub
also nur 5 Mal erhalten möchten, können Sie nur eine Regex übergeben, die nur fünf Mal mit den angegebenen Zeichenfolgen übereinstimmt.
Warum benutzt du gsub()
? Durch sein Design ist gsub
dazu gedacht, alle Vorkommnisse von etwas zu ersetzen, also kämpfen Sie sofort damit.
Verwenden Sie stattdessen sub
: