代码之家  ›  专栏  ›  技术社区  ›  Chris Tonkinson

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

  •  1
  • Chris Tonkinson  · 技术社区  · 15 年前

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

    1. 全部:归还所有东西
    2. 搜索:返回要搜索的第一个匹配项
    3. 全部*搜索:返回与搜索匹配的所有内容
    4. x*搜索:返回要搜索的前x个匹配项
    5. 搜索Y:返回匹配项进行搜索

    在哪里? 搜索 可以是单个关键字,也可以是由空格分隔的关键字列表,用单引号分隔。关键字是由一个或多个字母和数字组成的序列,其他的都没有。

    一些例子可能是:

    1. 2*
    2. 酒吧8
    3. 全部*“foo bar”

    这听起来非常复杂,以至于我想到了flex/bison——但是应用程序可能需要非常频繁地解析这样的字符串,我觉得(因为不需要计算)一个成熟的解析器会产生太多的开销。

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

    注意到这个伪语法的语法不会发生变化可能很有用,所以如果代码的可维护性不太好,我就不会哭了。这都是C++的,如果有区别的话。

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  0
  •   Ofir    15 年前

    答案主要取决于您想做多少编码和您想依赖多少库之间的平衡——如果您的应用程序可以依赖于其他库,您可以使用许多正则表达式库中的任何一个库——例如,所有Linux/Unix风格的posix regex。

    如果您只需要这些特定的语法,我将使用字符串标记器(strtok)——在“*”上拆分,在“”上拆分——然后处理每种情况。

        2
  •  2
  •   Remo.D    15 年前

    我不会仅仅为此而重新提出一个完整的lex/yacc解析器。您所描述的内容可以适用于一个简单的正则表达式:

     ((all|[0-9]+)\*)?('[A-Za-z0-9\t ]*'|[A-Za-z0-9]+)(#[0-9]+)?
    

    如果您有一个支持捕获的regex引擎,那么很容易提取您需要的单个信息。(最可能出现在捕获1、3和4中)。

    如果我理解您的意思,您可能会希望同时检查捕获1和捕获4不是非空的。

    如果您需要进一步拆分搜索词,可以在随后的步骤中解析捕获3。

    即使没有regex,我也会手工编写一个函数。它比处理lex/yacc要简单,我想你可以把比正则表达式更有效的东西组合起来。

        3
  •  0
  •   anijhaw    15 年前

    在这种情况下,strtok方法会更好,因为要解析的命令数量很少。