2013-07-24 23 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

@Angew謝謝你的回答,那就是問題所在。如果你願意,你可以寫你的解決方案作爲答案,我可以接受它,以便其他人也可以使用它。 –

回答

1

注意,直接寫入當該正則表達式轉換成C++代碼,並從文件中讀取時有一個明顯的句法差異。

在C++中,反斜線字符具有轉義語義,因此要將文字反斜槓放入字符串文字中,您必須使用反斜槓將其自身轉義。因此,要在內存中獲取兩個字符的字符串\b,必須使用字符串文字"\\b"。兩個反斜槓由C++編譯器解釋爲單個反斜槓字符以存儲在文字中。換句話說,strlen("\\b")是2.

另一方面,文本文件的內容由您的程序讀取,並且從不由C++編譯器處理。因此,要將兩個字符\b轉換爲從文件讀取的字符串,請將兩個字符的字符串\b寫入該文件。

0

這個問題可能是在功能從文件讀取的字符串。打印讀取的字符串並確保正確表達式正確讀取。

+0

你可以在自己的電腦上運行它嗎?因爲我一直在使用這個fileReader()用於其他目的,它工作得很好。 –

+0

@fery抱歉,我目前無法運行代碼。順便說一下,阿米爾已經指出了你的錯誤。 – Kolyunya

0

問題在於這兩行
buffer [length] ='\ 0';
text = string(buffer);

緩衝液[長度]應該已經緩衝液[長度 - 1]