2013-07-24 6 views
1

텍스트에서 regex 패턴을 찾으려고합니다. 텍스트를 호출 해 봅시다 : 원본 텍스트. 다음이 (가) patternFinder() 프로그램에 대한 코드는 다음 regular Expression 다음 내가 가진문자열 전달 인자, 파일에서 읽음

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; 
} 

:

"\\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

주 -

버퍼 [길이 완충액 [1 길이] 했어야.

C++에서 백 슬래시 문자는 이스케이프 의미론을 가지고 있으므로 리터럴 백 슬래시를 문자열 리터럴에 넣으려면 백 슬래시로 이스케이프 처리해야합니다. 따라서 메모리에 두 자로 된 문자열 \b을 얻으려면 문자열 리터럴 "\\b"을 사용해야합니다. 두 개의 백 슬래시는 C++ 컴파일러에서 리터럴에 저장 될 단일 백 슬래시 문자로 해석됩니다. 즉, strlen("\\b")은 2입니다.

반면에 텍스트 파일의 내용은 프로그램에서 읽히고 C++ 컴파일러에서는 처리되지 않습니다. 따라서 두 문자 \b을 파일에서 읽은 문자열로 가져 오려면 두 문자 문자열 \b 만 파일에 쓰십시오.

0

문제는 파일에서 문자열을 읽는 기능에 아마. 읽은 문자열을 출력하고 정규 표현식이 올바르게 읽혀지고 있는지 확인하십시오.

+0

자신의 PC에서 실행할 수 있습니까? 왜냐하면 난 다른 목적을 위해이 fileReader()를 사용하고 있었고 그것은 잘 작동했습니다. –

+0

@fery 죄송합니다. 지금은 코드를 실행할 수 없습니다. 그런데 aamir는 당신의 실수를 이미 지적했습니다. – Kolyunya

0

문제는이 두 줄에 있습니다.
버퍼 [길이] = '\ 0';
텍스트 = 문자열 (버퍼); 파일에서 읽을 때 C++ 코드에 직접 기록 정규식 때 명백한 구문 적 차이가 있음