2017-02-10 9 views
2

Допустим, у меня есть строка запроса, как, что:Синтаксического синтаксис простого запроса

#some terms! "phrase query" in:"my container" in:group_3 

или

#some terms! 

или

in:"my container" in:group_3 terms! "phrase query" 

или

in:"my container" test in:group_3 terms! 

Каков наилучший способ правильно разобрать?

Я посмотрел на Lucene's SimpleQueryParser, но это кажется довольно сложным для моего использования. И я пытаюсь разобрать этот запрос с помощью регулярных выражений, но до сих пор не очень успешный, в основном из-за возможности использования пробелов внутри котировок

Любая простая идея?

мне просто нужно, чтобы получить как можно вывести список элементов, потом это довольно легко для меня, чтобы решить остальные проблемы:

[ 
    "#some", 
    "terms!", 
    "phrase query", 
    "in:\"my container\"", 
    "in:group_3" 
] 
+0

Maby try включить ". *?" в вашем регулярном выражении это будет соответствовать чему-либо внутри "" –

+0

Я добавил возможный и очень простой вывод –

+0

@MYGz Я еще не эксперт по regex, но ваше решение выглядит хорошим вдохновением, за исключением того, что оно работает только для моего ввода, но это не так общий (например, он терпит неудачу для '# some terms!" фразового запроса "в:" мой контейнер ", который является моим запросом минус конец –

ответ

2

следующее регулярное выражение соответствует текст вашего выхода:

(?:\S*"(?:[^"]+)"|\S+) 

See the demo

+1

спасибо, что кажется большим! –

0

Только для тех, кто заинтересован, вот окончательный Scala/Java синтаксический анализатор Я использовал, чтобы решить мою проблему, вдохновленный ответы на этот вопрос:

def testMatcher(query: String): Unit = { 
    def optionalPrefix(groupName: String) = s"(?:(?:(?<$groupName>[a-zA-Z]+)[:])?)" 
    val quoted = optionalPrefix("prefixQuoted") + "\"(?<textQuoted>[^\"]*)\"" 
    val unquoted = optionalPrefix("prefixUnquoted") + "(?<textUnquoted>[^\\s\"]+)" 
    val regex = quoted + "|" + unquoted 
    val matcher = regex.r.pattern.matcher(query) 
    var results: List[QueryTerm] = Nil 
    while (matcher.find()) { 
    val quotedResult = Option(matcher.group("textQuoted")).map(textQuoted => 
     (Option(matcher.group("prefixQuoted")),textQuoted) 
    ) 
    val unquotedResult = Option(matcher.group("textUnquoted")).map(textUnquoted => 
     (Option(matcher.group("prefixUnquoted")),textUnquoted) 
    ) 
    val anyResult = quotedResult.orElse(unquotedResult).get 
    results = QueryTerm(anyResult._1,anyResult._2) :: results 
    } 
    println(s"results=${results.mkString("\n")}") 
}