gpt4 book ai didi

java - 解析搜索查询

转载 作者:行者123 更新时间:2023-12-01 16:09:11 25 4
gpt4 key购买 nike

我需要使用“类似 Google”的语法解析搜索查询(但更简单,因为我不需要括号、运算符嵌套等)。示例字符串可能是:

标签1:a、b、c 标签2:123 标签3:a、45、44、b

所以,简单地说,我需要识别看起来像标签(即“颜色”、“名称”、“年龄”)的标记,后跟 : 和单个“单词”或逗号分隔的单词列表我尝试使用一些正则表达式,但如果用户在语法上犯了错误(例如输入额外的逗号,或者忘记了标签后的值 - color: shape:),则解析失败。我真的不知道这是否是我的错(我远不是正则表达式专家),或者使用像 ANTLR 这样的解析器是否是更好的选择。无论如何,我愿意接受任何类型的建议(我正在用 java 编码 - 我知道该语言与之无关,但也许有一些工具可能会有所帮助)

感谢您的建议...

最佳答案

给定一个字符串,如“TAG1: a,b,c TAG2: 123 TAG3: a,45,44,b”

Pattern tokens = Pattern.compile( "([a-zA-Z0-9]+):\\s*(\\w+(?:,?\\w+)*)" );

Matcher m = tokens.matcher( myString );
while( m.find() ) {
System.out.println( "tag:" + m.group(1) + " value:" + m.group(2) );
}

这涵盖了您的所有案例并确保有一定的格式良好。如果我在您的问题中遗漏了某些内容,请告诉我。

编辑1:为了涵盖您的其他情况,您可以执行以下操作:

Pattern tokens = Pattern.compile( "([a-zA-Z0-9]+):\\s*(\\w+(?:[ ,]+?\\w+)*)(?=\\s+[a-zA-Z0-9]+:)|([a-zA-Z0-9]+):\\s*(\\w+(?:[ ,]+?\\w+)*)" );

然后还检查第 3 组和第 4 组。

尽管如此,这个正则表达式变得过于雄心勃勃......尽管我不相信完整的解析器会让您的生活在这种情况下变得更加轻松。

另一种方法是将其分解为一次一级(解析器无论如何都会这样做):

Pattern main = Pattern.compile( "([a-zA-Z0-9]+):" );
Matcher m = main.matcher(myString);
int lastStart = 0;
while( m.find() ) {
if( lastStart != 0 ) {
processToken( myString.substring(lastStart, m.start()) );
}
lastStart = m.start();
}
processToken( myString.substring(lastStart) );

或者类似的东西。它类似于强制使用 & 排序分隔符,但它考虑了标记语法的隐式分隔。

关于java - 解析搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1846347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com