寻找C ++ Regex可选包括空格

时间:2016-06-19 14:21:02

标签: regex escaping whitespace sequence

我有一个像

这样的字符串
TEST_F(ATestableComplexObject, CallsBaseClassMoveXWhenMoveXIsCalled)
{
    int dX(8);
    TestableComplexObject obj;

    EXPECT_CALL(obj, moveX(dX))
                .Times(1)
                .WillRepeatedly(testing::Invoke(&obj, &TestableComplexObject::doMoveX));

    obj.moveX(dX);
}

"<firstname>Anna</firstname>"

我希望使用正则表达式来获取它的名称(所以只有“Anna”或“Anna Lena”)。目前我正在使用:

"<firstname>Anna Lena</firstname>"

std::regex reg1 ("(<firstname>)([a-zA-Z0-9]*)(</firstname>)");

只适用于一个名称,但显然它在此之后遗漏了任何东西,因为它不考虑空格。现在我尝试添加std::regex_replace (std::back_inserter(result), input.begin(), input.end(), reg1, "$2"); \s,但我的IDE(Qt)告诉我,((([a-zA-Z0-9]*)|\s)*)是一个未知的转义序列。 目前,\s会产生"<firstname>Anna Lena</firstname>"

如何以优雅的方式解决这个问题?

2 个答案:

答案 0 :(得分:0)

对点使用不情愿的量词:

std::regex reg1 ("<firstname>(.*?)</firstname>");

或者,您可以使用&#34;而不是直角&#34;:

std::regex reg1 ("<firstname>[^<]*</firstname>");

请注意,我删除了标记文字周围不必要的组,因此目标现在是组1(您的正则表达式在组2中捕获它)。

答案 1 :(得分:0)

在我看来,back_converter中的regex_replace插入new elements automatically at the end of the container时遇到问题。

我建议将\s添加到字符类并匹配字符串,而不是重新分配矢量字符串。

这是demo of my approach

#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::vector<std::string> strings;
    strings.push_back("<firstname>Anna</firstname>");
    strings.push_back("<firstname>Anna Lena</firstname>");
    std::regex reg("(<firstname>)([a-zA-Z0-9\\s]*)(</firstname>)");
    for (size_t k = 0; k < strings.size(); k++)
    {
        smatch s;
        if (std::regex_match(strings[k], s, reg)) {
            strings[k] = s[2];
            std::cout << strings[k] << std::endl;
        }
    }
    return 0;
}

输出:

Anna
Anna Lena