【问题标题】:How do I use std::regex_replace to replace string into lowercase?如何使用 std::regex_replace 将字符串替换为小写?
【发布时间】:2018-11-02 04:37:55
【问题描述】:

我发现这个正则表达式可以替换 Regex replace uppercase with lowercase letters

Find: (\w) Replace With: \L$1 

我的代码

string s = "ABC";
cout << std::regex_replace(s, std::regex("(\\w)"), "\\L$1") << endl;

在 Visual Studio 2017 中运行。

输出:

\LA\LB\LC

如何在 C++ 中编写小写函数标记?

【问题讨论】:

  • 据我所知,小写是 Perl 风格的正则表达式独有的。 C++ 没有 Perl 风格的正则表达式语法选项,所以我猜它不能。当然,它对于文本编辑器中的即时更改很有用,但是您有一个字符串并且您有适用于字符串的算法,所以我不明白这一点。
  • @xskxzr,因为我的目的很复杂。不是简单地替换所有字符。像这样的“我不想……”,我想替换“不”,而不是“我”。正则表达式可以轻松做到这一点。
  • AFAIK,没有像 C++ 中的 \L$1 这样的魔法。最好的方法可能是使用对每个字符应用 tolower() 的 lambda 来提升 regex_replace。或者你可以在这里使用类似的技术:stackoverflow.com/questions/22617209/…

标签: c++ regex std


【解决方案1】:

由于没有像\L 这样的魔法,我们不得不妥协——使用 regex_search 并手动将上部转换为下部。

template<typename ChrT>
void RegexReplaceToLower(std::basic_string<ChrT>& s, const std::basic_regex<ChrT>& reg)
{
    using string = std::basic_string<ChrT>;
    using const_string_it = string::const_iterator;
    std::match_results<const_string_it> m;
    std::basic_stringstream<ChrT> ss;

    for (const_string_it searchBegin=s.begin(); std::regex_search(searchBegin, s.cend(), m, reg);)
    {
        for (int i = 0; i < m.length(); i++)
        {
            s[m.position() + i] += ('a' - 'A');
        }
        searchBegin += m.position() + m.length();
    }
}

void _replaceToLowerTest()
{
    string sOut = "I will NOT leave the U.S.";
    RegexReplaceToLower(sOut, regex("[A-Z]{2,}"));

    cout << sOut << endl;

}

【讨论】:

    猜你喜欢
    • 2021-02-14
    • 2012-10-15
    • 2012-04-13
    • 2017-07-26
    • 2018-12-28
    • 1970-01-01
    • 2010-10-09
    • 2016-09-13
    • 2021-06-11
    相关资源
    最近更新 更多