【发布时间】:2016-12-27 19:48:05
【问题描述】:
上下文:
我目前正在用 C++ 编写日期格式库。例如。该库接受一个格式化字符串,例如:dddd, mmmm d, dddd yyyy 并产生一个结果 Tuesday, December 26, Tuesday 2016 给定年份:2016,月份:12,日期:26(dddd 代表工作日,d 代表数字日期,@ 987654326@ 代表月份,yyyy 代表年份)。
我想通过使用boost::regex_replace 来实现这一点。
我尝试过的:
Javascript
在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 '';
}
C++
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,Tuesday 内部的d 就成为regex2 的目标模式,导致它被26 替换。
我不确定如何解决此问题,或者我认为我解决此问题的 C++ 方法不正确。是否有可能在 C++ boost::regex 中有类似于 Javascript 的东西?
任何帮助将不胜感激!
【问题讨论】:
-
借助 Boost,您应该能够使用条件替换模式,例如搜索
(dddd)|(d)|(mmmm)|(yyyy)并替换为(?{1}Tuesday:?{2}26:?{3}December:2016)