6

我认为 $ 表示字符串的结尾。然而,下面的代码给出了“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 中轻松找到),但没有成功……有人能指出我正确的方向吗?

问候, RP

4

2 回答 2

2

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

来自Boost::Regex

锚点:

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

当用作表达式的最后一个字符或子表达式的最后一个字符时,'$' 字符应匹配行尾。

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

来自:Boost Regex以及:

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

我希望这会有所帮助。

于 2010-12-10T13:59:24.890 回答
2

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

(.|\r|\n)*?

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

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

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

(?:.|\r|\n)*?
于 2012-03-20T12:28:43.103 回答