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

Passing string Argument, read from a file

本文关键字:文件 读取 字符串 Argument      更新时间:2023-10-16

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

开头提到的原文是:

  • 2013年1月10日700 West Market Street OH 35611asdh

并且只有粗体文本应该与正则表达式匹配。现在的问题是,当regex作为从文本文件中读取的字符串传递时,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]='';
    text =string(buffer);
    fclose(fin);
    return text;
}  

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

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

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

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

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

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