замена регулярных выражений с увеличением числа - PullRequest
1 голос
/ 06 декабря 2010

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

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

на

%0 %1 %2

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

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

Ответы [ 4 ]

4 голосов
/ 06 декабря 2010

Это возможно с регулярным выражением в 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'
3 голосов
/ 06 декабря 2010

Вы можете использовать Regex.Replace, он имеет удобную перегрузку , которая принимает обратный вызов :

string s = "[something] [nothing interesting here] [boring.....]";
int counter = 0;
s = Regex.Replace(s, @"\[[^\]]+\]", match => "%" + (counter++));
2 голосов
/ 06 декабря 2010

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

answer = ''
found  = 0
while str matches \[[^\[\]]\]:
    answer = answer + '%' + (found++) + ' '
1 голос
/ 06 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...