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;

}  
4

3 回答 3

1

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

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

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

于 2013-07-24T12:15:04.527 回答
0

问题出在这两行
buffer[length]='\0';
文本=字符串(缓冲区);

buffer[length] 应该是 buffer[length - 1]

于 2013-07-24T11:04:11.577 回答
0

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

于 2013-07-24T10:41:14.597 回答