我目前正在用C++编写日期格式库.例如.该库接收格式化字符串,例如:dddd, mmmm d, dddd yyyy并生成Tuesday, December 26, Tuesday 2016给定年份的结果:2016年,月份:12,日期:26(dddd代表工作日,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 '';
}
Run Code Online (Sandbox Code Playgroud)
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");
}
Run Code Online (Sandbox Code Playgroud)
然而,这给了我一个结果"Tues26ay, December 26, Tues26ay 2016".其原因是:当我更换模式dddd与Tuesday中,d内Tuesday成为目标模式为regex2使其被替换26.
我不知道如何解决这个问题,或者我认为我的C++解决这个问题的方法是不正确的.是否可以在C++ boost :: regex中使用类似Javascript的东西?
任何帮助,将不胜感激!
我不知道为什么你没有真正的1对1翻译:
#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";
}
Run Code Online (Sandbox Code Playgroud)
打印
Result: Tuesday, December 26, 2016
Run Code Online (Sandbox Code Playgroud)
奖金: