我正在尝试构建一个类似于Google上的搜索(关于用双引号封装的完全匹配)。
让我们使用以下短语作为示例
“短语搜索”单个术语[不同短语]
目前,如果我使用以下代码
Dim searchTermsArray As String() = searchTerms.Split(New String() {" ", ",", ";"}, StringSplitOptions.RemoveEmptyEntries)
For Each entry In searchTermsArray
Response.Write(entry & "<br>")
Next
我的输出是
“短语
搜索“
单
条款
[不同
短语]
但我真正需要的是构建一个键值对
phrase search | table1
single | table1
terms | table1
different phrase | table2
其中table1是一个包含常规信息的表,而table2是一个类似于stackoverflow上的“tags”表。
有人能指出我如何正确捕捉输入吗?
答案 0 :(得分:3)
你想做的不是那么微不足道。实现“类似于谷歌”的搜索远远不能解析搜索字符串。
我建议你不要重新发明轮子,而是使用生产就绪解决方案,例如Apache Lucene.NET或Apache Solr。那些处理解析和全文搜索。
但是如果你只需要解析这种字符串那么你应该考虑Pete指出的解决方案。
答案 1 :(得分:0)
正则表达式是你的朋友。见this question
答案 2 :(得分:0)
根据您计划获得的花哨程度,您可能会考虑Irony附带的搜索语法/实现。
答案 3 :(得分:0)
搜索字符串解析是一个非常规问题。这意味着虽然正则表达式可以看似接近,但如果不使用专有扩展,构建一个难以维护的表达式混乱,会留下令人讨厌的边缘情况,并且无法按照您的喜好工作,或三者的某种组合。
相反,有三种正确的方法可以解决这个问题:
对于这个级别的问题(并且假设搜索的核心足以完成你自己想要实现的内容),我可能会选择选项3.当你意识到这个问题时,这会更有意义表达式本身就是如何设置状态机的说明。你正在做的就是在你的代码中构建它。这使您能够调整性能和功能,而无需在代码中添加更大的词法分析器组件。
有关如何执行此操作的示例,请查看我对此问题的回答:
Reading CSV files in C#
我要做的就是构建一个状态机来逐字符地解析字符串。这将是实现完全正确解决方案的最简单方法,也应该产生最快的代码。
答案 4 :(得分:-1)
我会选择正则表达式