C++ TR1 regex - multiline option

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-12 10:48:19

问题


I thought that $ indicates the end of string. However, the following piece of code gives "testbbbccc" as a result, which is quite astonishing to me... This means that $ actually matches end of line, not end of the whole string.

#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;
    }
} 

I have been trying to find a "multiline" switch (which actually can be easily found in PCRE), but without success... Can someone point me to the right direction?

Regards, R.P.


回答1:


As Boost::Regex was selected for tr1, try the following:

From Boost::Regex

Anchors:

A '^' character shall match the start of a line when used as the first character of an expression, or the first character of a sub-expression.

A '$' character shall match the end of a line when used as the last character of an expression, or the last character of a sub-expression.

So the behavior you observed is correct.

From: Boost Regex as well:

\A Matches at the start of a buffer only (the same as \`).
\z Matches at the end of a buffer only (the same as \').
\Z Matches an optional sequence of newlines at the end of a buffer: equivalent to the regular expression \n*\z

I hope that helps.




回答2:


There is no multiline switch in TR1 regexs. It's not exactly the same, but you could get the same functionality matching everything:

(.|\r|\n)*?

This matches non-greedily every character, including new line and carriage return.

Note: Remember to escape the backslashes '\' like this '\\' if your pattern is a C++ string in code.

Note 2: If you don't want to capture the matched contents, append '?:' to the opening bracket:

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


来源:https://stackoverflow.com/questions/4408914/c-tr1-regex-multiline-option

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!