【问题标题】:How do I parse a base query (à la Google Data) in Java?如何在 Java 中解析基本查询(à la Google Data)?
【发布时间】:2010-09-17 01:57:51
【问题描述】:

我有一个系统,我可以在其中查询 REST / Atom 服务器以获取文档。查询受到 GData 的启发,看起来像:

http://server/base/feeds/documents?bq=[type in {'news'}]

我必须解析“bq”参数才能知道将返回哪种类型的文档而无需实际执行查询。比如,

bq=[type = 'news']                      ->  return ["news"]
bq=[type in {'news'}]                   ->  return ["news"]
bq=[type in {'news', 'article'}]        ->  return ["news", "article"]
bq=[type = 'news']|[type = 'article']   ->  return ["news", "article"]
bq=[type = 'news']|[title = 'My Title'] ->  return ["news"]

基本上,查询语言是可以与 OR(“|”)或 AND(无分隔符)组合的谓词列表。每个谓词都是对一个字段的约束。约束可以是 =、、=、in 等...在任何有意义的地方都可以有空格。

我在 Regexp、StringTokenizer、StreamTokenizer 等之间有点迷茫……我被 Java 1.4 困住了,所以没有 Parser……

谁能给我指出正确的方向?

谢谢!

【问题讨论】:

    标签: java parsing gdata-api


    【解决方案1】:

    正确的方法是使用解析器生成器,如 AntlrJFlexJavaCC

    一种快速而肮脏的方法是:

    String[] disjunctedPredicateGroups = query.split("\|");
    List<String[]> normalizedPredicates = ArrayList<String[]>;
    for (String conjunction : disjunctedPredicateGroups ) {
       normalizedPredicates.add(conjunction.split("\[|\]"));
    }
    // process each predicate
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多