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

发布于 2024-10-07 07:56:13 字数 684 浏览 1 评论 0原文

我认为 $ 表示字符串的结尾。然而,下面的代码给出了“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

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 << 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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱殇璃 2024-10-14 07:56:13

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

来自 Boost::Regex

锚点:

“^”字符应与开头匹配
用作第一条线时的线
表达式的特征,或者
子表达式的第一个字符。

“$”字符应与结尾匹配
用作最后一个字符时的一行
一个表达式,或者最后一个
子表达式的字符。

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

来自: Boost 正则表达式 还有:

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

我希望有所帮助。

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.

不乱于心 2024-10-14 07:56:13

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

(.|\r|\n)*?

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

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

注2:如果不想捕获匹配的内容,请在左括号后添加“?:”:

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

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)*?
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文