- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的一个项目中,我需要能够提供一个非常简单的变量查找和替换解析器(主要用于路径)。变量主要在启动期间使用,偶尔用于访问文件(不是程序的主要功能,只是加载资源),因此解析器不需要高性能。但是,我非常希望它是线程安全的。
解析器需要能够存储一组变量(目前为 map<string, string>
)并能够用字符串中的相应值替换标记。变量值可能包含其他变量,这些变量将在使用变量时解决(添加时不会,因为变量可能会随着时间的推移而添加)。
当前的变量语法看起来像这样:
$basepath$/resources/file.txt
/$drive$/$folder$/path/file
我当前的解析器使用一对 stringstream
s(“output”和“varname”),写入“output”流直到找到第一个 $,写入“varname”流直到找到第二个 $,然后查找变量(使用 varname.str()
的内容)。它非常简单并且运行良好,即使在对变量值进行递归时也是如此。
String Parse(String input)
{
stringstream output, varname;
bool dest = false;
size_t total = input.length();
size_t pos = 0;
while ( pos < total )
{
char inchar = input[pos];
if ( inchar != '$' )
{
if ( dest ) output << inchar;
else varname << inchar;
} else {
// Is a varname start/end
if ( !dest )
{
varname.clear();
dest = true;
} else {
// Is an end
Variable = mVariables.find(varname.str());
output << Parse(Variable.value());
dest = false;
}
}
++pos;
}
return output.str();
}
(错误检查等删除)
但是,当我尝试将它应用到我想要的语法时,该方法失败了。我想要类似于 Visual Studio 用于项目变量的东西:
$(basepath)/resources/file.txt
/$(drive)/$(folder)/path/file
我也希望能够做到:
$(base$(path))/subdir/file
在变量名中递归让我陷入困境,我不确定继续进行的最佳方式。
目前,我有两个可能的概念:
遍历输入字符串,直到找到 $,寻找 ( 作为下一个字符,然后找到匹配的 )(计算进出级别,直到达到正确的关闭 paran)。发送该位进行解析,然后使用返回值作为变量名。然而,这看起来会很困惑并导致大量复制。
第二个概念是使用 char *
,或者可能是 char * &
,然后向前移动,直到我到达一个终止的空值。解析器函数可以在解析变量名称时在对自身的递归调用中使用指针。我不确定如何最好地实现这项技术,除了让每个调用跟踪它解析出的名称,并附加它进行的任何调用的返回值。
该项目只需要在 VS2010 中编译,因此 STL 流和字符串、C++0x 的支持位以及 Microsoft 特定的功能都是公平的游戏(如果这些要求发生变化,通用解决方案更可取,但事实并非如此在这一点上是必要的)。但是,使用其他库并不好,尤其是 Boost。
我的两个想法似乎都比需要的更复杂、更困惑,所以我正在寻找一种干净利落的方式来处理这个问题。非常欢迎讨论如何最好地做到这一点的代码、想法或文档。
最佳答案
简单的解决方案是搜索字符串中的第一个')',然后向后移动以查看是否有以“$(”开头的标识符。如果有,请替换它并重新开始扫描。如果没有找到"$("identifier,然后找到下一个 ')' - 如果没有,你就完成了。
解释一下:通过搜索 )
,您可以确定您正在为您的替换找到一个完整的标识符,然后它有机会为后续替换中使用的其他标识符做出贡献.
例子
Had a great time on $($(day)$(month)), did you?
Dictionary: "day" -> "1", "month" -> "April", "1April" -> "April Fools Day"
Had a great time on $($(day)$(month)), did you?
^ find this
Had a great time on $($(day)$(month)), did you?
^^^^^^ back up to match this complete substitution
Had a great time on $(1$(month)), did you?
^ substitution made, restart entire process...
Had a great time on $(1$(month)), did you?
^ find this
etc.
关于c++ - 简单(moSTLy)变量解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5534029/
我有一个程序返回数字结果的数字(目前为 6 个),将它们转换为字符串,然后连接它们以通过 ZMQ 发送。 示例输出是: 结果:7.85、-5.75、16.0、0.0、0.84375、0.828125
动态编程 |集合 33(查找一个字符串是否与另外两个字符串交错) http://www.geeksforgeeks.org/check-whether-a-given-string-is-an-int
这个问题在这里已经有了答案: Which sort algorithm works best on mostly sorted data? [closed] (20 个答案) 关闭 8 年前。 我正
我正在用 C# 为聊天室编写一个机器人,我想检测一条消息是否包含太多大写字母。如果消息的大写字母总数超过消息总长度的 三分之一 并且总长度大于 13,则消息包含太多大写字母。这是为了防止较小的消息被标
我正在尝试在 Java 中使用线程池。但是线程的数量是未知的,所以我试图找到一个解决方案。然后出现两个问题: 一段时间以来,我一直在寻找增加线程池大小的方法,但我还没有想出办法。有什么建议吗?有人说
(在 Visual Studio 中使用 C++) 我有以下用于创建宇宙飞船对象的默认构造函数: Ship() // default constructor { name = "[ship u
对于类(class),我必须创建一个州对象的二叉树,每个州对象都包含一个常驻对象的二叉树,用于组织居住在每个州的人。我正在尝试按名称在整个州树中搜索一个人(州树和居民树都是按名称的字母顺序排列的),这
假设您有大量流行语言(Java、C、C++ 等)的源代码(如 50GB 以上)。 项目需求是: 压缩源代码以减少磁盘使用和磁盘 I/O 以无需解压整个文件即可从压缩源中提取特定源文件的方式对其进行索引
我想在我的代码中包含一个模式。单击按钮/href 时,模式中应显示不同的文件。我只是从 here 中获取了代码. 现在,在加载动画后(或几毫秒后)模态窗口就关闭了。奇怪的是,当你按下按钮几次时,它偶尔
我试图用 HREF 包装所有出现的 IP 地址,这样我就可以做一些事情了。 我已经通过几个验证器运行正则表达式本身,并且它与预期的模式匹配。因此,我认为我的问题在于实现,但我看不到正确的路径。有人可以
我正在尝试使用 Apache Tika 通过使用 ByteArrayInputStream 处理二进制文件来解析 pdf 文件...并且开始出现某些 pdf 文件的错误,并且对于某些 pdf 文件来说
格式为: 0 995 112 // there is an empty line here too 所以,我正在做: with open("in.txt") as f: articles =
给定一个线性递增的数组,但是 可能会遗漏一些数字 可能会有一些意想不到的数字, 您将如何构建算法以从数组中删除所有离群值? 可能的数组示例: 1,2,3,4,1,1,1,100,5,6,7 1,2,4
我想标记格式化字符串(非常类似于 printf),我想我只遗漏了一点点: %[number][one letter ctYymd] 应成为 token ² $1...$10 将成为代币 所有其他(普通
在我的一个项目中,我需要能够提供一个非常简单的变量查找和替换解析器(主要用于路径)。变量主要在启动期间使用,偶尔用于访问文件(不是程序的主要功能,只是加载资源),因此解析器不需要高性能。但是,我非常希
我目前正在重写一个电子商店 - 但仅限于客户端,即 CMS 大部分保持完好。我没有使用预构建的框架,因为系统必须保持与 CMS 的向后兼容性,而且我必须拥有完全自由的代码结构。 新系统完全基于 MVC
主要是头文件的文件结构(90% 的代码都是头文件)是否会减慢除了编译之外的任何事情? 有些人认为,在速度优化的情况下,它可能会导致大多数代码的内联,因此处理器会计算有关指令调用或类似内容的错误统计信息
想想 MUD/MUCK,但可能还有头像或现场插图。我选择的语言是 ruby。 我需要处理多个持久连接,数据在服务器和它的各种客户端之间异步传输。单个数据库必须根据客户端 session 中发生的事件保
场景:我试图在 git 下获取我的 unix 点文件。我必须(至少)在 cygwin 环境和一些标准的 linux 发行版(ubuntu 和 opensuse)之间工作,并且我有仅特定于 cygwin
我已经阅读了关于 the use of reinterpret_cast 的各种先前问题。 ,并且我还阅读了 C++ 标准中的相关措辞。本质上,它归结为指针到指针 reinterpret_cast 操
我是一名优秀的程序员,十分优秀!