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

时间:2009-12-14 07:02:59

标签: c++ regex parsing command-line string

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

     
  1. all:return everything
  2.  
  3. 搜索:返回第一个匹配搜索
  4.  
  5. all * search:返回匹配搜索的所有内容
  6.  
  7. X *搜索:返回前X个匹配搜索
  8.  
  9. 搜索#Y:返回第Y个匹配进行搜索
  10. 其中搜索可以是单个关键字,也可以是以空格分隔的关键字列表,由单引号分隔。关键字是一个或多个字母和数字的序列 - 没有别的。

    一些例子可能是:

       
    1. 2 * foo的
    2.  
    3. 棒#8
    4.  
    5. all *'foo bar'
    6. 这听起来很复杂,可以想到flex / bison - 但是应用程序可能期望必须经常解析这样的字符串,我觉得(因为没有涉及计数)一个完全成熟的解析器会完全招致开销太大了。

      你会推荐什么?一系列字符串操作?一些强大的子模式捕获正则表达式? 对于“真正的”解析器来说实际上是一个合理的论据吗?

      可能有用的是要注意这个伪语法的语法不会发生变化,所以如果代码的结果不是很好,那么我就不会哭了。这一切都在C ++中,如果这有所不同。

      谢谢!

3 个答案:

答案 0 :(得分:2)

我不会为此推荐完整的lex / yacc解析器。您所描述的内容可以使用简单的正则表达式:

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

如果您拥有支持捕获的正则表达式引擎,则可以轻松提取所需的单个信息。 (最有可能捕获1,3和4)。

如果我明白你的意思,你可能想要检查捕获1和捕获4是否同时不是非空的。

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

即使没有正则表达式,我也会写一个函数。它比处理lex / yacc更简单,我想你可以把一些比正则表达式更有效的东西放在一起。

答案 1 :(得分:0)

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

OR

如果你只是想要那些特定的语法,我会使用字符串标记符(strtok) - 拆分'*'并拆分'#' - 然后处理每个案例。

答案 2 :(得分:0)

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