我目前正在用C ++编写日期格式库。例如。该库接收格式字符串,例如:dddd, mmmm d, dddd yyyy
并生成结果Tuesday, December 26, Tuesday 2016
给定年份:2016年,月份:12,日期:26(dddd
代表工作日,{{1} }代表日期的数量,d
代表月份,mmmm
代表年份
我想通过使用yyyy
来实现这一目标。
在boost::regex_replace
我可以通过以下方式轻松实现:
javascript
var pattern = 'dddd, mmmm d, yyyy';
pattern.replace(/(dddd)|(d)|(mmmm)|(yyyy)/gi, function (dddd, d, mmmm, yyyy){
if (dddd) {
return 'Tuesday';
}
if (d) {
return '26'
}
if (mmmm) {
return 'December';
}
if (yyyy) {
return '2016';
}
return '';
}
然而,这给了我boost::regex regex1("(dddd)");
boost::regex regex2("(d)");
boost::regex regex3("(mmmm)");
boost::regex regex4("(yyyy)");
boost::smatch match;
// dddd
if (boost::regex_search(pattern, match, regex1))
{
pattern = boost::regex_replace(pattern, regex1, "Tuesday");
}
// d
if (boost::regex_search(pattern, match, regex2))
{
pattern = boost::regex_replace(pattern, regex2, "26");
}
// mmmm
if (boost::regex_search(pattern, match, regex3))
{
pattern = boost::regex_replace(pattern, regex3, "December");
}
// yyyy
if (boost::regex_search(pattern, match, regex4))
{
pattern = boost::regex_replace(pattern, regex4, "2016");
}
的结果。原因是:只要我将模式"Tues26ay, December 26, Tues26ay 2016"
替换为dddd
,Tuesday
内的d
就会成为Tuesday
的目标模式,导致它被替换与regex2
。
我不知道如何解决这个问题,或者我认为我的C ++解决这个问题的方法是不正确的。是否可以在C ++ boost :: regex中使用类似Javascript的东西?
任何帮助将不胜感激!
答案 0 :(得分:5)
我不知道为什么你没有真正的1对1翻译:
<强> Live On Coliru 强>
#include <boost/regex.hpp>
#include <iostream>
int main() {
std::string pattern = "dddd, mmmm d, yyyy";
pattern = boost::regex_replace(pattern, boost::regex("(dddd)|(d)|(mmmm)|(yyyy)"), [](auto& match)->std::string{
if (match.str() == "dddd")
return "Tuesday";
if (match.str() == "d")
return "26";
if (match.str() == "mmmm")
return "December";
if (match.str() == "yyyy")
return "2016";
return "";
});
std::cout << "Result: " << pattern << "\n";
}
打印
Result: Tuesday, December 26, 2016
加成:
答案 1 :(得分:1)
一个简单的解决方案是用一个控制字符替换工作日,这个控件字符确定不会出现在其他地方,然后在最后用适当的工作日替换它;我没有提升,但它适用于std :: regex。
添加/修改:
boost::regex regex5("(\x01)");
//dddd
pattern = regex_replace(pattern, regex1, "\x01");
//then the fifth check
pattern = regex_replace(pattern, regex5, "Tuesday");