C++中的快速字符串解析和替换[已关闭]

blpfk2vs  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(94)

已关闭。此问题需要details or clarity。目前不接受回答。
**要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

10小时前关闭。
Improve this question
给定一个长字符串S,包含以下包含在%中的替换字符串,您将如何解析字符串并替换给定的值:yyyy -> 4位数年份
yy -> 2位数年份
mm -> 2位数月份
dd -> 2位数天
hh -> 2位数小时
MM -> 2位数分钟
ss -> 2位数秒
ampm -> AM或PM
例如,字符串Y%yyyy%M%mm%D%dd%_H%hh%M%MM%S%ss%%ampm%和当前时间和日期设置为2024/01/06 10:12:26 am,结果是Y2024M01D06_H10M12S26AM
请注意,替换字符串可以出现多次。
你建议用C++(使用标准C++库)来实现什么算法?

1l5u6lss

1l5u6lss1#

长话短说:不要重新发明轮子,只需使用std::chrono库中可用的year_month_day std::formatterhh_mm_ss std::formatter

#include <chrono>
#include <format>
#include <iostream>
#include <string>

static std::string GetTimestamp(bool fourDigitYear) {
    const auto now = std::chrono::system_clock::now();
    std::chrono::year_month_day ymd{ std::chrono::floor<std::chrono::days>(now) };
    std::chrono::zoned_time zt{ std::chrono::current_zone(), (now) };
    const auto lt = zt.get_local_time();
    const auto tod = lt - std::chrono::floor<std::chrono::days>(lt);
    const std::chrono::hh_mm_ss hms{ std::chrono::floor<std::chrono::seconds>(tod) };

    if (fourDigitYear) {
        return std::format("Y{0:%Y}M{0:%m}D{0:%d}_H{1:%H}M{1:%M}S{1:%S%p}", ymd, hms);
    }
    else {
        return std::format("Y{0:%y}M{0:%m}D{0:%d}_H{1:%H}M{1:%M}S{1:%S%p}", ymd, hms);
    }
}

int main() {
    std::cout << GetTimestamp(true);
}

字符串
为了好玩,这里有一个模板化的if-consexpr版本:

#include <chrono>
#include <format>
#include <iostream>
#include <string>

template<typename bool fourDigitYear>
static std::string GetTimestamp() {
    const auto now = std::chrono::system_clock::now();
    const std::chrono::year_month_day ymd{ std::chrono::floor<std::chrono::days>(now) };
    const std::chrono::zoned_time zt{ std::chrono::current_zone(), (now) };
    const auto lt = zt.get_local_time();
    const auto tod = lt - std::chrono::floor<std::chrono::days>(lt);
    const std::chrono::hh_mm_ss hms{ std::chrono::floor<std::chrono::seconds>(tod) };

    if constexpr (fourDigitYear) {
        return std::format("Y{0:%Y}M{0:%m}D{0:%d}_H{1:%H}M{1:%M}S{1:%S%p}", ymd, hms);
    } else {
        return std::format("Y{0:%y}M{0:%m}D{0:%d}_H{1:%H}M{1:%M}S{1:%S%p}", ymd, hms);
    }
}

int main() {
    std::cout << GetTimestamp<false>() << '\n';
    std::cout << GetTimestamp<true>();
}

相关问题