我有一个像
这样的字符串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>"
。
如何以优雅的方式解决这个问题?
答案 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
添加到字符类并匹配字符串,而不是重新分配矢量字符串。
#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