我有一个命令行应用程序需要支持以下品牌的参数:
其中搜索可以是单个关键字,也可以是以空格分隔的关键字列表,由单引号分隔。关键字是一个或多个字母和数字的序列 - 没有别的。
一些例子可能是:
这听起来很复杂,可以想到flex / bison - 但是应用程序可能期望必须经常解析这样的字符串,我觉得(因为没有涉及计数)一个完全成熟的解析器会完全招致开销太大了。
你会推荐什么?一系列字符串操作?一些强大的子模式捕获正则表达式? 对于“真正的”解析器来说实际上是一个合理的论据吗?
可能有用的是要注意这个伪语法的语法不会发生变化,所以如果代码的结果不是很好,那么我就不会哭了。这一切都在C ++中,如果这有所不同。
谢谢!
答案 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方法会更好,因为要解析的命令数量很少。