gpt4 book ai didi

c++ - 如何在 C++ 中正确存储正则表达式匹配

转载 作者:太空狗 更新时间:2023-10-29 21:20:18 25 4
gpt4 key购买 nike

我想通过解析 UVA985 中的输入来尝试使用 C++11 regex 库,但是,我不明白如何将所有匹配项存储在一个容器中以便我可以遍历和工作与它。

#include <regex>
#include <string>
#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;

vector<string> get_names(const string &sentence) {
vector<string> vname;
regex author_regex("(.+\\.\\,\\s)|(.+\\.:)", regex_constants::ECMAScript);
smatch names; // This is always empty
regex_match(sentence, names, author_regex); // Is this correct?
for (auto name: names) {
vname.push_back(name.str() + ".");
}
return vname;
}

int main(void) {
const string papers[] = {
"Smith, M.N., Martin, G., Erdos, P.: Newtonian forms of prime \
factor matrices",
"Erdos, P., Reisig, W.: Stuttering in petri nets",
"Smith, M.N., Chen, X.: First oder derivates in structured programming",
"Jablonski, T., Hsueh, Z.: Selfstabilizing data structures" };
vector<vector<string>> input_data;
for (auto paper : papers) {
input_data.push_back(get_names(paper));
}

int counter = 1;
for (auto scenario : input_data) {
cout << "Paper " << counter << ":\n";
for (auto author: scenario) {
cout << author << endl;
counter += 1;
}
}
return 0;
}

我尝试将正则表达式模式更改为像 . 这样简单的东西,但是容器 smatch 总是空的,我是不是漏掉了什么?

最佳答案

在容器中存储可以通过两种方式完成,范围构造和默认构造然后插入。 <regex>库包含 std::sregex_token_iterator这将返回与您的模式匹配的字符串。我们可以使用它来构建范围并返回 std::vector<> .

std::vector<std::string> names(std::sregex_token_iterator(sentence.begin(), sentence.end(), author_regex),
std::sregex_token_iterator());
return names;

现在您的正则表达式需要一些工作。引文中的每个作者字段都由姓氏 ( "\\w+," ) 和代表名字/中间名的首字母 ( "(\\w.)+" ) 定义。现在,只要我们没有遇到冒号,我们就想这样做,所以我们可以在表达式前加上 "(?!:)" 前缀。 .只需结合这三者,我们现在就可以从每个引文中获取所有作者的姓名。不幸的是,除了第一个名字之外的每个名字现在都有一个前导空格。可以通过忽略任何前导空格 ( "[^ ]+" ) 来删除它。现在我们把它们结合起来,我们得到 "(?!:)[^ ]+\\w+, (\\w.)+" .你的get_names()现在看起来像

std::vector<std::string> get_names(const std::string& sentence) {
std::regex author_regex("(?!:)[^ ]+\\w+, (\\w.)+", std::regex_constants::ECMAScript);

std::vector<std::string> names(std::sregex_token_iterator(sentence.begin(), sentence.end(), author_regex),
std::sregex_token_iterator());
return names;
}

回到 main() , 如果你想用 std::copy() 转储名称进入std::vector<>std::back_inserter()或进入 std::set<>std::inserter() .

int main() {
const std::string citations[] = {"Smith, M.N., Martin, G., Erdos, P.: Newtonian forms of prime factor matrices",
"Erdos, P., Reisig, W.: Stuttering in petri nets",
"Smith, M.N., Chen, X.: First oder derivates in structured programming",
"Jablonski, T., Hsueh, Z.: Selfstabilizing data structures"};
std::set<std::string> all_authors;

for (const auto& citation : citations) {
auto citation_authors = get_names(citation);
std::copy(citation_authors.begin(), citation_authors.end(), std::back_inserter(all_authors));
}
}

关于c++ - 如何在 C++ 中正确存储正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24925094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com