C ++ TR1正则表达式 - 多行选项

时间:2010-12-10 12:42:49

标签: c++ regex tr1

我认为$表示字符串结束。但是,下面的一段代码给出了“testbbbccc”,这对我来说非常惊人......这意味着$实际上匹配行尾,而不是整个字符串的结尾。

#include <iostream>
#include <regex>

using namespace std;

int main()
{
    tr1::regex r("aaa([^]*?)(ogr|$)");
    string test("bbbaaatestbbbccc\nddd");
    vector<int> captures;
    captures.push_back(1);
    const std::tr1::sregex_token_iterator end;
    for (std::tr1::sregex_token_iterator iter(test.begin(), test.end(), r, captures); iter != end; )
    {
        string& t1 = iter->str();
        iter++;
        cout &lt;&lt; t1;
    }
} 

我一直试图找到一个“多线”开关(实际上可以在PCRE中轻松找到),但没有成功......有人能指出我正确的方向吗?

此致 R.P。

2 个答案:

答案 0 :(得分:2)

为tr1选择了Boost :: Regex,请尝试以下操作:

来自Boost::Regex

  

锚:

     

'^'字符应与开头匹配   当用作第一行时的一行   表达的特征,或者   子表达式的第一个字符。

     

'''字符应匹配结尾   用作最后一个字符时的一行   表达式,或者最后一个   子表达式的特征。

所以你观察到的行为是正确的。

来自:Boost Regex

  

\A匹配缓冲区的开头   仅(与\`相同)。
  \z匹配   仅缓冲区的结尾(与...相同)   \')。
  \Z匹配可选序列   缓冲区末尾的换行符:   相当于正则表达式   \n*\z

我希望有所帮助。

答案 1 :(得分:2)

TR1正则表达式中没有多行开关。它并不完全相同,但您可以获得与所有内容相匹配的相同功能:

(.|\r|\n)*?

这匹配非贪婪每个字符,包括换行和回车。

注意:如果您的模式是代码中的C ++字符串,请记住要像'\'那样转义反斜杠'\\'

注意2:如果您不想捕获匹配的内容,请将“?:”附加到左括号:

(?:.|\r|\n)*?