2017-02-12 21 views
0

Ich habe einen regulären Ausdruck:regulärer Ausdruck ersetzen: zählen die „eine oder mehr“ Vorkommen Menge

/([^\r])(\n)+/ 

und ich möchte es mit ersetzt werden:

"#{$1}#{replacement_var}" 

wenn $2 sein muss, die genaue Anzahl von "\n" s, die nach einem nicht "\r" Zeichen kommen.

Zum Beispiel: Wenn replacement_var = "ben", dann:

"0\n\r\n\n123\n\n\n456\r\n" 

sollte worden:

"0ben\r\nben123benbenben456\r\n" 

ich einen Trick gibt die ([^\r]) in der Regex oben tun kann und dann wieder ersetzen ("\ rben "mit" \ r \ n "), aber ich frage mich, ob ich zwei Regex-Operationen vermeiden kann und es in einem tun.

+0

Bitte lesen "[MCVE]". Wir würden gerne den minimalen Code sehen, den Sie geschrieben haben, um das zu lösen. Momentan haben Sie uns nur Anforderungen gegeben, was so klingt, als wollten wir es für Sie schreiben. Es ist nicht gut, sich auf "$ 1" und "$ 2" Aufnahmen zu verlassen. Sie sind Globals und werden gestampft werden. Sehen Sie sich stattdessen die benannten Captures in der Regex-Dokumentation an. –

Antwort

2

Probieren Sie etwas wie

replacement_var = "ben" 
"0\n\r\n\n123\n\n\n456\r\n".gsub(/((?<!\r)\n+)/) { replacement_var * $1.size } 
#=> "0ben\r\nben123benbenben456\r\n" 
+0

Du hast mich dazu geschlagen :) Ich hatte etwas ganz ähnliches, aber ich habe zu viel Zeit damit verschwendet, zu überdenken, was du so elegant mit $ 1.size erreicht hast. Sehr schön! –

+1

Für die Aufzeichnung, das war, was ich schließlich mit im Wesentlichen Ihren, aber mit einer benannten Erfassungsgruppe endete: 's.gsub (/ (? (?

Verwandte Themen