奇怪的正则表达式与测试人员不同

时间:2015-09-08 05:59:41

标签: c++ regex

我遵循正则表达式来匹配输入字符串上的HTTP标头和正文:

([^()<>@,;:\\\"/\\[\\]?={}\\s\\t]+):(?:[\\s\\t]+)?(.+)\\r\\n(?:\\r\\n([\\s\\S]+))?

圆括号显示预期的匹配:

(Header-Name): (Its_value)
(Im-a-header): (Im_a_value)

(Anything here,
commonly HTML code...
...)

使用PCRE,Python或JavaScript版本在Regex101.com中工作正常,但是当我使用regex_search在C ++中测试它时,只有第一个头匹配,甚至不再是主体。使用来自boost::regex的Perl风格会产生更奇怪的输出。

测试代码:

#include <regex>
#include <string>
#include <iostream>

int main()
{
        const std::string data("Name: value\r\nFoo: bar\r\n\r\nanything\r\nhere");
        std::regex pattern("([^()<>@,;:\\\"/\\[\\]?={}\\s\\t]+):(?:[\\s\\t]+)?(.+)\\r\\n(?:\\r\\n([\\s\\S]+))?");
        std::smatch result;

        std::regex_search(data, result, pattern);

        for(const auto &match : result)
                std::cout << match << std::endl;
}

输出:

Name: value

Name
value

输出从std更改为boost(并自动更改为Perl风格):

Name: value
Foo: bar

anything here

Name
value
Foo: bar

anything here

Obs。:我仅使用boost来测试结果输出。我不想要任何Perl特定的解决方案。

我希望使用以下代码获得类似于以下内容的输出:

Name
value
Foo
bar
anything
here

有人可以理解这是什么问题并帮助我吗?

1 个答案:

答案 0 :(得分:1)

似乎有几个问题。

  1. 您需要多次运行Item[0]以获得每个havinf捕获组的几个匹配项。
  2. 由于您需要修改输入字符串,因此需要将其声明为常量。
  3. 正则表达式本身将echo $xml->Items->Item[0]->OfferSummary->TotalNew->__toString(); 放入第3组,您应该在尝试打印/获取之前检查它是否已填写。
  4. 这是一个固定版本:

    regex_search

    IDEONE demo。输出:

    anything\r\nhere