2013-07-24 3 views
1

Я пытаюсь найти шаблон regex в тексте. Назовем текст: исходный текст. Ниже приведен код программы patternFinder():Передача строки Аргумент, считанный из файла

vector <pair <long,long> >CaddressParser::patternFinder(string pattern) 

{ 


     string m_text1=m_text; 
     int begin =0; 
     int end=0; 
     smatch m; 
     regex e (pattern); 



    vector<pair<long, long>> indices; 
    if(std::regex_search(m_text1,m,e)) 
    { 
     begin=m.position(); 
     end=m.position()+m.length()-1; 
     m_text1 = m.suffix().str(); 
     indices.push_back(make_pair(begin,end)); 
     while(end<m_length&&std::regex_search(m_text1,m,e)) 
      { 
       begin=end+m.prefix().length()+1; 
       end=end+m.prefix().length()+m.length(); 
       indices.push_back(make_pair(begin,end)); 
       m_text1 = m.suffix().str(); 

      } 
     return indices; 
    } 

    else return indices; 
} 

У меня есть следующие regular Expression:

"\\b[0-9]{3}\\b.*(Street).*[0-9]{5}" 

и оригинальный текст, упомянутый в начале является:

  • путь 10,01. 2013 700 West Market Street OH 35611 asdh

и только жирный текст должен соответствовать регулярному выражению. Теперь проблема заключается в том, когда регулярное выражение передается как строка, которая была прочитана из текстового файла, patternFinder() не распознает шаблон. Однако, когда прямая строка (которая идентична той, что находится в текстовом файле) передается как аргумент patternFinder() работает. Откуда могла возникнуть эта проблема?

Ниже приведен код моей fileReader() функции, которые я не думаю, что очень уместно упомянуть:

string CaddressParser::fileReader(string fileName) 
{ 

    string text; 
    FILE *fin; 
    fin=fopen(fileName.c_str(),"rb"); 
    int length=getLength(fileName); 
    char *buffer= new char[length]; 
    fread(buffer,length,1,fin); 
    buffer[length]='\0'; 
    text =string(buffer); 
    fclose(fin); 

    return text; 

} 
+1

Если у вас есть 'char * buffer = new char [length]', вам действительно не следует обращаться к 'buffer [length]', это после конца массива. Сделайте его больше: 'char * buffer = new char [length + 1]' – Messa

+1

Можете ли вы показать точное содержимое файла (содержащего регулярное выражение)? Я спрашиваю, потому что, когда вы читаете файл, вам нужны одиночные обратные косые черты вместо двойных. – Angew

+0

@ Спасибо за ваш ответ, в котором проблема была. Если вы хотите, вы можете написать свое решение в качестве ответа, и я могу принять его, чтобы другие могли его использовать. –

ответ

1

Обратите внимание, что существует очевидная разница синтаксической при написании регулярных выражений непосредственно в C++ кода, и при чтении из файла.

В C++ символ обратной косой черты имеет семантику escape, поэтому, чтобы поставить буквальный обратный слэш в строковый литерал, вы должны сбежать от него с помощью обратного слэша. Итак, чтобы получить в памяти двухсимвольную строку \b, вы должны использовать строковый литерал "\\b". Две обратные слэши интерпретируются компилятором C++ как один символ обратной косой черты, который должен храниться в литерале. Другими словами, strlen("\\b") is 2.

С другой стороны, содержимое текстового файла считывается вашей программой и никогда не обрабатывается компилятором C++. Поэтому, чтобы получить два символа \ и b в строку, считанную из файла, напишите в файл только двухсимвольную строку \b.

0

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

+0

Вы могли бы запустить его на своем ПК. Потому что я использовал этот файлReader() для других целей, и он работал отлично. –

+0

@fery извините, я не могу запустить код на данный момент. Кстати, амир уже указал вашу ошибку. – Kolyunya

0

Проблема в этих двух строках
buffer [length] = '\ 0';
текст = строка (буфер);

буфер [длина] должен быть буфер [длина - 1]

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