gpt4 book ai didi

c++ - 需要解析一个字符串,有一个掩码(像这样的 "%yr-%mh-%dy"),所以我得到了 int 值

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:25 27 4
gpt4 key购买 nike

例如,我必须在字符串 "The date is 2009-August-25."中找到标题中提到的格式(但 %-tags 顺序可以不同)的时间。 我怎样才能让程序解释标签以及使用什么结构更好地存储它们以及有关如何处理某些日期字符串片段的信息?

最佳答案

先看boost::date_time图书馆。它有 IO system女巫可能是你想要的,但我发现缺乏搜索。

要进行自定义日期搜索,您需要 boost::xpressive .它包含您需要的任何东西。让我们看看我仓促写的例子。首先你应该解析你的自定义模式,使用 Xpressive 很容易。首先看你需要的header:

#include <string>
#include <iostream>
#include <map>
#include <boost/xpressive/xpressive_static.hpp>
#include <boost/xpressive/regex_actions.hpp>

//make example shorter but less clear
using namespace boost::xpressive;

第二个定义特殊标签的 map :

std::map<std::string, int > number_map;
number_map["%yr"] = 0;
number_map["%mh"] = 1;
number_map["%dy"] = 2;
number_map["%%"] = 3; // escape a %

下一步是创建一个正则表达式女巫,它将使用标签解析我们的模式,并在找到标签时将 map 中的值保存到变量 tag_id 中,否则保存 -1:

int tag_id;
sregex rx=((a1=number_map)|(s1=+~as_xpr('%')))[ref(tag_id)=(a1|-1)];

更多信息和描述看herehere .现在让我们解析一些模式:

  std::string pattern("%yr-%mh-%dy"); // this will be parsed

sregex_token_iterator begin( pattern.begin(), pattern.end(), rx ), end;
if(begin == end) throw std::runtime_error("The pattern is empty!");

sregex_token_iterator将遍历我们的标记,每次都会设置 tag_id 变量。我们所要做的就是使用此标记构建正则表达式。我们将使用数组中定义的静态正则表达式的标记对应部分构造此正则表达式:

sregex regex_group[] = {
range('1','9') >> repeat<3,3>( _d ), // 4 digit year
as_xpr( "January" ) | "February" | "August", // not all month XD so lazy
repeat<2,2>( range('0','9') )[ // two digit day
check(as<int>(_) >= 1 && as<int>(_) <= 31) ], //only bettwen 1 and 31
as_xpr( '%' ) // match escaped %
};

最后,让我们开始构建我们的特殊正则表达式。第一场比赛将构建它的第一部分。如果标签匹配并且 tag_id 是非负的,我们从数组中选择正则表达式,否则匹配可能是分隔符,我们构造正则表达式匹配它:

sregex custom_regex = (tag_id>=0) ? regex_group[tag_id] : as_xpr(begin->str());

接下来我们将从头到尾迭代并追加下一个正则表达式:

while(++begin != end)
{
if(tag_id>=0)
{
sregex nextregex = custom_regex >> regex_group[tag_id];
custom_regex = nextregex;
}
else
{
sregex nextregex = custom_regex >> as_xpr(begin->str());
custom_regex = nextregex;
}
}

现在我们的正则表达式准备好了,让我们找一些日期:-]

std::string input = "The date is 2009-August-25.";

smatch mydate;
if( regex_search( input, mydate, custom_regex ) )
std::cout << "Found " << mydate.str() << "." << std::endl;

xpressive 库非常强大和快速。图案的运用也很漂亮。

如果你喜欢这个例子,请在评论或点中告诉我 ;-)

关于c++ - 需要解析一个字符串,有一个掩码(像这样的 "%yr-%mh-%dy"),所以我得到了 int 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1326795/

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