Удаление соответствия регулярному выражению - PullRequest
2 голосов
/ 23 февраля 2010

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

#include <boost/regex.hpp>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include "time.h"
using namespace std;


class application{
private:
 //Variables
 boost::regex expression;
 boost::smatch matches;
 string line;
 string pat;
 int lineNumber;
 string replace;
 char time[9];
 char date[9];

 //Functions
 void getExpression(){
  cout << "Expression: ";
  cin >> pat;
  try{
   expression = pat;
  }
  catch(boost::bad_expression){
   cout << pat << " is not a valid regular expression\n";
   exit(1);
  }
 }

 void boostMatch(){
  //Files to open
  //Input Files
  ifstream in("files/trff292010.csv");
   if(!in) cerr << "no file\n";
  //Output Files
   ofstream out("files/ORIGtrff292010.csv");
   ofstream newFile("files/NEWtrff292010.csv");
   ofstream record("files/record.dat");
  //time
   _strdate_s(date);
   _strtime_s(time);
   lineNumber = 0;

  while(in.peek() != EOF){
   getline(in, line, '\n');
   lineNumber++;
   out << line << "\n";
   if (regex_search(line, matches, expression)){
    for (int i = 0; i<matches.size(); ++i){

     record << "Date: "<< date << "Time: " << time << "\tmatches[" << i << "]: " << matches[i] << "\n\tLine Number: "<< lineNumber<< '\n\t\t' << line << '\n';
     boost::regex_replace(line, expression, "");
     newFile << line << "\n";
    }
   }else{
    newFile << line << "\n";
   }
  }
 }

public:
 void run(){
  replace = "";
  getExpression();
  boostMatch();
 }
};

Как видите, я пытался использовать boost :: regex_replace, чтобы просто заменить найденное пробелом, но это не сработало. Тест, который я выполнял, использует [*], чтобы найти все звездочки перед некоторыми именами в списке. Пример * Алиса. Программа действительно находит звезду, но не удаляет это просто Алиса

Ответы [ 3 ]

5 голосов
/ 26 февраля 2010

Кажется, что boost :: regex_replace возвращает строку вместо изменения ввода. См. документацию для этого метода .

Попробуйте вместо этого:

newFile << boost::regex_replace(line, expression, "") << "\n";
1 голос
/ 26 февраля 2010

Это довольно распространенная проблема, http://bytes.com/topic/c/answers/166133-problem-boost-regex_replace

Может быть, эта ссылка поможет

1 голос
/ 26 февраля 2010

Побег * с \.

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