假设我有一个字符串:
argsStr = "server ('m1.labs.terad ''ata.com') username ('us ''er5') password('user)5') dbname ('def\\ault')";
现在我使用以下代码来提取标记:
'm1.labs.terad ''ata.com' <- token1
'us ''er5' <-token2
'user)5' <-token3
'def\ault' <-token4
代码:
regex re("(\'(.*?)\'\)");
typedef std::vector<std::string> StringVector;
StringVector arg_values;
boost::regex re_arg_values("('[^']*(?:''[^']*)*')");
boost::sregex_token_iterator name_iter_start(argsStr.begin(),argsStr.end(), re_arg_values, 0),name_iter_end;
std::copy(value_iter_start, value_iter_end,std::back_inserter(arg_values));
//putting the token in the string vector.
现在将其放入字符串 vector 后,如何转换标记/字符串以用单引号替换双引号:
例如:
'm1.labs.terad ''ata.com' 应该变成 'm1.labs.terad 'ata.com' 并且
'us ''er5' 应该变成 'us 'er5'。
我可以为此使用 boost::replace_all 吗?
最佳答案
好的。您已经连续问了 6 个有关此解析作业的问题¹。
很多人一直在告诉您正则表达式不是完成这项工作的工具。 Including me :
我给你看了
我所有的示例都非常出色,因为它们已经将键与值一起解析,因此您拥有正确的配置设置映射。
但您在最新的问题 ( Extract everything apart from what is specified in the regex ) 中仍然要求它。
当然答案在我的第一个答案中:
for (auto& setting : parse_config(text))
std::cout << setting.first << "\n";
我posted this连同它的 C++03 版本 live on Coliru
如果你因为不明白而拒绝它,你所要做的就是问。
如果您“不想”使用 Spirit,您可以轻松地手动编写一个类似的解析器。我没有,因为它很乏味且容易出错。如果您需要它来获得灵感,请看这里:
map<string, string> BOTTOM LINE: Use a proper grammar like people have been urging you since day 1
#include <iostream>
#include <sstream>
#include <map>
typedef std::map<std::string, std::string> Config;
typedef std::pair<std::string, std::string> Entry;
struct Parser {
Parser(std::string const& input) : input(input) {}
Config parse() {
Config parsed;
enum { KEY, VALUE } state = KEY;
key = value = "";
f = input.begin(), l = input.end();
while (f!=l) {
//std::cout << "state=" << state << ", '" << std::string(It(input.begin()), f) << "[" << *f << "]" << std::string(f+1, l) << "'\n";
switch (state) {
case KEY:
skipws();
if (!parse_key())
raise("Empty key");
state = VALUE;
break;
case VALUE:
if (!expect('(', true))
raise("Expected '('");
if (parse_value('\'') || parse_value('"')) {
parsed[key] = value;
key = value = "";
} else {
raise("Expected quoted value");
}
if (!expect(')', true))
raise("Expected ')'");
state = KEY;
break;
};
}
if (!(key.empty() && value.empty() && state==KEY))
raise("Unexpected end of input");
return parsed;
}
private:
std::string input;
typedef std::string::const_iterator It;
It f, l;
std::string key, value;
bool parse_key() {
while (f!=l && alpha(*f))
key += *f++;
return !key.empty();
}
bool parse_value(char quote) {
if (!expect(quote, true))
return false;
while (f!=l) {
char const ch = *f++;
if (ch == quote) {
if (expect(quote, false)) {
value += quote;
} else {
//std::cout << " Entry " << key << " -> " << value << "\n";
return true;
}
} else {
value += ch;
}
}
return false;
}
static bool space(unsigned char ch) { return std::isspace(ch); }
static bool alpha(unsigned char ch) { return std::isalpha(ch); }
void skipws() { while (f!=l && space(*f)) ++f; }
bool expect(unsigned char ch, bool ws = true) {
if (ws) skipws();
if (f!=l && *f == ch) {
++f;
if (ws) skipws();
return true;
}
return false;
}
void raise(std::string const& msg) {
std::ostringstream oss;
oss << msg << " (at '" << std::string(f,l) << "')";
throw std::runtime_error(oss.str());
}
};
int main() {
std::string const text = "server ('m1.labs.terad ''ata.com') username ('us\\* er5') password('user)5') dbname ('def\\ault')";
Config cfg = Parser(text).parse();
for (Config::const_iterator setting = cfg.begin(); setting != cfg.end(); ++setting) {
std::cout << "Key " << setting->first << " has value " << setting->second << "\n";
}
for (Config::const_iterator setting = cfg.begin(); setting != cfg.end(); ++setting) {
std::cout << setting->first << "\n";
}
}
一如既往地打印:
Key dbname has value def\ault
Key password has value user)5
Key server has value m1.labs.terad 'ata.com
Key username has value us\* er5
dbname
password
server
username
¹ 见
关于c++ - 将双单引号 (' ' ) 替换为单引号 ('),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45272783/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="