C++ 查找字母子字符串

C++ 查找字母子字符串,c++,regex,gcc,c++11,substring,C++,Regex,Gcc,C++11,Substring,我有以下字符串,我只想从中提取大于1的字母部分(字母子字符串): %d。i、 p.p.attendu-->attendu 1954年4月至。专业知识 n、 c.p.c.康达姆纳-->康达姆纳 我正在尝试以下代码: #include <regex> #include <iostream> void main() { const std::string s = "% d. i.p.p. attendu"; std::regex rgx("[a-zA-Z]{

我有以下字符串,我只想从中提取大于1的字母部分(字母子字符串):

  • %d。i、 p.p.attendu-->attendu
  • 1954年4月至。专业知识
  • n、 c.p.c.康达姆纳-->康达姆纳
我正在尝试以下代码:

#include <regex>
#include <iostream>
void main()
{
    const std::string s = "% d. i.p.p. attendu";
    std::regex rgx("[a-zA-Z]{2,20}");
    std::smatch match;

    if (std::regex_search(s.begin(), s.end(), match, rgx))
        std::cout << "match: " << match[1] << '\n';
} 
#包括
#包括
void main()
{
const std::string s=“%d.i.p.p.attendu”;
std::regex rgx(“[a-zA-Z]{2,20}”);
std::smatch匹配;
if(std::regex_搜索(s.begin(),s.end(),match,rgx))
标准::cout
我想知道是否可以一次返回每个值而不是一个字符串

唯一的方法似乎是通过。下面是一个使用Boost的示例:

#include <boost/regex.hpp>
#include <iostream>

int main() {
    const std::string s = "% d. i.p.p. tototo attendu";
    boost::regex rgx("([a-zA-Z]{2,20})");
    boost::smatch match;

    boost::sregex_iterator begin{s.begin(), s.end(), rgx},
                           end{};

    for (auto&& i = begin; i != end; ++i)
        std::cout << "match: " << *i << '\n';
}
两件事:

  • main
    的返回类型是始终
    int
    。您的代码甚至不应该编译
  • 我在正则表达式(第一个,这是正确的!)周围添加了括号,以便它为每个匹配创建一个捕获。然后迭代器依次迭代每个匹配
我想知道是否可以一次返回每个值而不是一个字符串

唯一的方法似乎是通过。下面是一个使用Boost的示例:

#include <boost/regex.hpp>
#include <iostream>

int main() {
    const std::string s = "% d. i.p.p. tototo attendu";
    boost::regex rgx("([a-zA-Z]{2,20})");
    boost::smatch match;

    boost::sregex_iterator begin{s.begin(), s.end(), rgx},
                           end{};

    for (auto&& i = begin; i != end; ++i)
        std::cout << "match: " << *i << '\n';
}
两件事:

  • main
    的返回类型是始终
    int
    。您的代码甚至不应该编译
  • 我在正则表达式(第一个,这是正确的!)周围添加了括号,以便它为每个匹配创建一个捕获。然后迭代器依次迭代每个匹配

您可能正在使用GCC。他们的正则表达式实现令人讨厌。与clang++(除了
void main
match[1]
-应该是
match[0]
)一起使用。代码看起来不错。如果您可以使用
clang++
或MSVC,您将获得更好的结果。(您可以使用Boost.Regex替换缺少的GCC实现。)/@PeteBecker GCC没有Regex实现,只有函数存根。@KonradRudolph-正如我所说,这是一个讨厌的东西。也许我应该把“实现”放在在引号中。
您可能正在使用GCC。他们的正则表达式实现令人讨厌。与clang++(除了
void main
match[1]
-应该是
match[0]
)一起使用。代码看起来不错。如果您可以使用
clang++
或MSVC,您会得到更好的结果。(您可以使用Boost.Regex替换缺少的GCC实现。)/@PeteBecker GCC没有Regex实现,只有函数存根。@KonradRudolph-正如我所说,这是一个讨厌的东西。也许我应该把“实现”放在引用。
谢谢@Konrad,我实际上一直在尝试修改正则表达式。我不太理解以下部分:如果可以问:for循环中:auto&&i@HaniGoc在C++11中,
auto
声明一个变量并从初始化中推断其类型简而言之,
auto&
推导出了
i
的引用类型。我也可以编写
boost::sregex_迭代器&
,但由于
auto&&
较短,因此在循环范围内通常更受欢迎。谢谢@Konrad,我实际上一直在尝试修改正则表达式。我我真的不理解以下部分:如果可以问:for循环中:auto&&i@HaniGoc在C++11中,
auto
声明一个变量并从初始化中推断其类型。
&
在本文中是一个–简而言之,
auto&
推断
i
的引用类型。我也可以相反,我们编写了
boost::sregex_迭代器&
,但由于
auto&
较短,因此在循环范围内通常首选它。
match: tototo
match: attendu