2010-12-06 26 views
1

Ich mag würde den folgenden Satz regex/ersetzen:regex Ersatz durch eine zunehmende Zahl

[something] [nothing interesting here] [boring.....] 

von

%0 %1 %2 

Mit anderen Worten, alle Ausdrücke, die mit [] werden zu einem % gebaut gefolgt von einer steigenden Zahl ...

Ist es möglich, es sofort mit einem Regex zu tun?

+2

Was Regex-Engine/Dienstprogramm verwenden Sie? – kzh

+0

Dies ist nicht möglich, wenn nur regulärer Ausdruck verwendet wird. Welche Implementierung verwenden Sie? (Sollte das sein Welche Implementierung ...? =)) – Jens

+0

Es wäre gut, die Sprache zu kennen, mit der Sie arbeiten. – jwueller

Antwort

4

Dies ist mit Regex in C# möglich, da Regex.Replace einen Delegaten als Parameter annehmen kann.

 Regex theRegex = new Regex(@"\[.*?\]"); 
     string text = "[something] [nothing interesting here] [boring.....]"; 
     int count = 0; 
     text = theRegex.Replace(text, delegate(Match thisMatch) 
     { 
      return "%" + (count++); 
     }); // text is now '%0 %1 %2' 
2

Nicht direkt seit dem, was Sie beschreiben, hat eine prozedurale Komponente. Ich denke, Perl könnte dies zwar über seinen qx-Operator zulassen (denke ich), aber im Allgemeinen müssen Sie die Zeichenfolge, die ziemlich einfach sein sollte, durchlaufen.

answer = '' 
found = 0 
while str matches \[[^\[\]]\]: 
    answer = answer + '%' + (found++) + ' ' 
+0

Ja, also wäre es nicht möglich, es nur mit Regex zu machen? –

+0

Reguläre Ausdrücke werden zum Vergleichen/Parsen verwendet. Wie würdest du irgendetwas nur mit regulären Ausdrücken ersetzen? – aioobe

+0

@Andy M: Nein, dies ist nur mit regulären Ausdrücken nicht möglich. Sie benötigen einige zusätzliche Kontrollstrukturen. – jwueller

3

Sie können Regex.Replace verwenden, hat es eine handy overload that takes a callback:

string s = "[something] [nothing interesting here] [boring.....]"; 
int counter = 0; 
s = Regex.Replace(s, @"\[[^\]]+\]", match => "%" + (counter++)); 
1

PHP und Perl unterstützen beide einen 'Rückruf' Ersatz, so dass Sie einen Code Haken in den Austausch zu erzeugen. Hier ist, wie Sie es in PHP tun könnten mit preg_replace_callback

class Placeholders{ 
    private $count; 

    //constructor just sets up our placeholder counter 
    protected function __construct() 
    { 
     $this->count=0; 
    } 

    //this is the callback given to preg_replace_callback 
    protected function _doreplace($matches) 
    { 
     return '%'.$this->count++; 
    } 

    //this wraps it all up in one handy method - it instantiates 
    //an instance of this class to track the replacements, and 
    //passes the instance along with the required method to preg_replace_callback  
    public static function replace($str) 
    { 
     $replacer=new Placeholders; 
     return preg_replace_callback('/\[.*?\]/', array($replacer, '_doreplace'), $str); 
    } 
} 


//here's how we use it 
echo Placeholders::replace("woo [yay] it [works]"); 

//outputs: woo %0 it %1 

Sie können dies tun, mit einem globalen var und einer regelmäßigen Callback-Funktion, aber es in der Klasse Verpackung ist ein wenig übersichtliche.