C++ 解析小型特定参数的最有效方法

C++ 解析小型特定参数的最有效方法,c++,regex,parsing,command-line,string,C++,Regex,Parsing,Command Line,String,我有一个命令行应用程序,需要支持以下品牌的参数: 全部:全部归还 搜索:返回要搜索的第一个匹配项 全部*搜索:返回与搜索匹配的所有内容 X*search:返回要搜索的前X个匹配项 搜索#Y:返回要搜索的Yth匹配项 其中,搜索可以是单个关键字,也可以是由单引号分隔的空格分隔的关键字列表。关键字是由一个或多个字母和数字组成的序列,除此之外没有其他内容 例如: 2*foo 巴#8 所有*‘富吧’ 这听起来很复杂,让我想到了flex/bison——但是应用程序可能需要频繁地解析这样的字符串,我觉得(因

我有一个命令行应用程序,需要支持以下品牌的参数:

  • 全部:全部归还
  • 搜索:返回要搜索的第一个匹配项
  • 全部*搜索:返回与搜索匹配的所有内容
  • X*search:返回要搜索的前X个匹配项
  • 搜索#Y:返回要搜索的Yth匹配项
  • 其中,搜索可以是单个关键字,也可以是由单引号分隔的空格分隔的关键字列表。关键字是由一个或多个字母和数字组成的序列,除此之外没有其他内容

    例如:

  • 2*foo
  • 巴#8
  • 所有*‘富吧’
  • 这听起来很复杂,让我想到了flex/bison——但是应用程序可能需要频繁地解析这样的字符串,我觉得(因为不涉及计数)一个成熟的解析器会产生太多的开销

    你推荐什么?一长串的字符串操作?几个强大的捕获正则表达式的子模式?对于“真正的”解析器,实际上有一个似是而非的论点吗

    请注意,这个伪语法的语法是不会改变的,所以如果代码的可维护性不好,我就不会哭了。这都是C++的,如果这有区别。< /P>
    谢谢

    我不会为此推荐一个完整的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,我在没有正则表达式库的情况下找到了一个相当简单的解决方案。