【问题标题】:C++ TR1 regex - multiline optionC++ TR1 正则表达式 - 多行选项
【发布时间】:2010-12-10 12:42:49
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪种 tr1 实现?
  • 我使用的是 Visual Studio 2008。
  • 正如我在下面所说的 - 尝试 \z 而不是 $

标签: c++ regex tr1


【解决方案1】:

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

来自Boost::Regex

锚点:

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

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

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

发件人:Boost Regex 以及:

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

    (.|\r|\n)*?
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多