我正在编写一个搜索解析器。有一个输入搜索查询(String)需要转换为单独的条件对象。
例如,/ perons /?q = age> 50& name:mike
此查询将转换为两个条件对象。 1.GreaterThanCondition(字符串字段,int值) 2.LikeCondition(String field,String value)
我有14个这样的条件对象来实现条件接口。
在运行时,我从查询中解析字符串条件(如“age> 50”),我需要设计一种能够有效地将此条件转换为适当对象(如GreaterThanCondition)的算法。
这是我想的一个算法:创建一个ConditionFactory。此ConditionFactory将采用此字符串(“age> 50”)并以特定顺序迭代现有的14个工厂(每个条件一个工厂)以匹配工厂中定义的正则表达式(例如,GreaterThanConditionFactory的正则表达式可以是[ a-zA-Z0-9] +> + [0-9] +。基于正则表达式匹配,GreaterThanConditionFactory可以从条件中识别字段(年龄)和值(50)并创建GreaterThanConditionObject。
通过这种方法,我需要创建15个工厂和14个条件对象。 我不确定创建那么多工厂是不是一个好的解决方案。 请建议。
答案 0 :(得分:0)
您可以使用一个非常简单的recursive descent parser,它使用CharacterIterator和builder。这将更具可读性,它比检查14个正则表达式更快,并且它将支持多个查询条件。
public class QueryParser {
CharacterIterator iterator;
QueryBuilder queryBuilder;
QueryConditionBuilder queryConditionBuilder;
public Query parse(String text) {
iterator = new StringCharacterIterator(text);
queryBuilder = new QueryBuilder();
while (hasNext()) {
queryConditionBuilder = new QueryConditionBuilder();
conditionSeparator();
queryCondition();
queryBuilder.withCondition(queryConditionBuilder.getQueryCondition());
}
return queryBuilder.getQuery();
}
public void conditionSeparator() {
// if the next character is an &, then advance the iterator
}
public void parseQueryCondition() {
key();
operator();
value();
}
public void parseKey() {
// ... keep reading until the next character is not alphabetic
queryConditionBuilder.withKey(key);
}
public void parseOperator() {
// ... could be as simple as a one character check
queryConditionBuilder.withOperator(operator);
}
public void parseValue() {
// ... probably a number, so just read until the next character is not a digit or you reach the end of a string
queryConditionBuilder.withValue(value);
}
public Character peek() {
// delegate to character iterator
}
public Character next() {
// delegate to character iterator
}
public boolean hasNext() {
// delegate to character iterator
}
}