2010-12-06 3 views
1

Я хотел бы регулярное выражение/заменить следующий набор:регулярное выражение замены с увеличением числа

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

по

%0 %1 %2 

Другими словами, любые выражения, которые построены с [] станет % а затем увеличивающееся число ...

Возможно ли это сделать с помощью регулярного выражения?

+2

Какой двигатель/утилита regex вы используете? – kzh 2010-12-06 14:31:31

+0

Это невозможно с использованием только регулярного выражения. Какую реализацию вы используете? (Если это будет какая реализация ....? =)) – Jens 2010-12-06 14:31:39

ответ

4

Это возможно с регулярным выражением в C#, так как Regex.Replace может принимать делегат в качестве параметра.

 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

Непосредственно, так как то, что вы описываете, имеет процедурный компонент. Я думаю, что Perl может позволить это, хотя оператор qx (я думаю), но в целом вам нужно перебирать строку, которая должна быть довольно простой.

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

Вы можете использовать Regex.Replace, он имеет handy overload that takes a callback:

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

PHP и Perl и поддерживает «обратный вызов» замену, что позволяет подключить некоторый код в генерировании замены. Вот как вы можете сделать это в PHP с 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 

Вы могли бы сделать это с помощью глобальной переменной и регулярной функции обратного вызова, но окружив его в классе немного аккуратнее.

Смежные вопросы