C++ 解析小型特定参数的最有效方法
我有一个命令行应用程序,需要支持以下品牌的参数:C++ 解析小型特定参数的最有效方法,c++,regex,parsing,command-line,string,C++,Regex,Parsing,Command Line,String,我有一个命令行应用程序,需要支持以下品牌的参数: 全部:全部归还 搜索:返回要搜索的第一个匹配项 全部*搜索:返回与搜索匹配的所有内容 X*search:返回要搜索的前X个匹配项 搜索#Y:返回要搜索的Yth匹配项 其中,搜索可以是单个关键字,也可以是由单引号分隔的空格分隔的关键字列表。关键字是由一个或多个字母和数字组成的序列,除此之外没有其他内容 例如: 2*foo 巴#8 所有*‘富吧’ 这听起来很复杂,让我想到了flex/bison——但是应用程序可能需要频繁地解析这样的字符串,我觉得(因
谢谢 我不会为此推荐一个完整的lex/yacc解析器。您所描述的内容适用于一个简单的正则表达式:
((all|[0-9]+)\*)?('[A-Za-z0-9\t ]*'|[A-Za-z0-9]+)(#[0-9]+)?
如果您有一个支持捕获的正则表达式引擎,则很容易提取所需的单个信息。(最有可能在捕获1、3和4中)
如果我理解您的意思,您可能需要检查捕获1和捕获4是否同时为非空
如果需要进一步拆分搜索词,可以在后续步骤解析capture 3中完成
即使没有正则表达式,我也会手工编写一个函数。这比处理lex/yacc更简单,我想你可以组合一些比正则表达式更有效的东西。答案主要取决于你想做多少编码和你想依赖多少库之间的平衡-如果你的应用程序可以依赖其他库,您可以使用许多正则表达式库中的任何一个,例如所有Linux/Unix版本都附带的POSIX正则表达式库 或
如果您只需要这些特定的语法,我会使用字符串标记器(strtok)-在“*”上拆分,在“#”上拆分-然后处理每种情况。在这种情况下,strtok方法会更好,因为要解析的命令数量很少。这很好地证实了我的想法(使用regex)。同意我可以编写原始字符串操作,以比将PCRE拉入冲突更有效地满足账单要求——但经过思考,那里的净收益可能不值得我花时间调试。谢谢你的洞察力!我会说“这听起来很简单,可以手工编写代码。”我在没有lex/yacc/regexp的情况下完成了比这更复杂的解析。我喜欢你的观点——事实上,我已经后退了一步,再次研究了这个问题,现在看到了纯字符串操作可以轻松解决这个问题。虽然我决定不使用strtok,我在没有正则表达式库的情况下找到了一个相当简单的解决方案。