传递字符串参数,从文件中读取

时间:2013-07-24 10:38:28

标签: c++ regex

我正在尝试在文本中找到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}"

和开头提到的原始文本是:

  • way 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;

}  

3 个答案:

答案 0 :(得分:1)

请注意,将正则表达式直接写入C ++代码以及从文件中读取它时,存在明显的语法差异。

在C ++中,反斜杠字符具有转义语义,因此要将字面反斜杠放入字符串文字中,必须使用反斜杠将其自身转义。因此,要在内存中获得两个字符的字符串\b,您必须使用字符串文字"\\b"。 C ++编译器将两个反斜杠解释为单个反斜杠字符,以存储在文字中。换句话说,strlen("\\b")是2。

另一方面,文本文件的内容由程序读取,不会被C ++编译器处理。因此,要将两个字符\b放入从文件读取的字符串中,只需将两个字符的字符串\b写入文件中。

答案 1 :(得分:0)

问题可能在于从文件中读取字符串的函数。打印字符串read并确保正确读取正则表达式。

答案 2 :(得分:0)

问题出在这2行中     缓冲液[长度] = '\ 0';
    text = string(buffer);

buffer [length]应该是缓冲区[length - 1]