gpt4 book ai didi

.net - 用于类似 Gmail 的搜索的正则表达式

转载 作者:行者123 更新时间:2023-12-04 18:12:30 32 4
gpt4 key购买 nike

我一直在尝试为类似 Gmail 的搜索找出一个正则表达式,即:

name:Joe surname:(Foo Bar)

...就像在 this topic .但略有不同:如果有没有 key: 的文本,它也被拆分了,所以:

foo:(hello world) bar:(-{bad things}) some text to search

会返回:

foo:(hello world)
bar:(-{bad things})
some text to search

最佳答案

使用 Regex 路由时面临的问题是遇到空格问题。可能有一个非常复杂的正则表达式来做到这一点,但对于一个简单的正则表达式,你会发现你的搜索不能包含关键字的空格,例如:

Works: site:mysite user:john
Fails: site:"my awesome site" user:john



这将失败,因为它基于空格进行标记。因此,如果需要空间支持,请继续阅读……

我建议要么使用 Lucene .NET 引擎的内置解析器为您提供标记,要么使用语法和解析器,例如 GoldParser、Irony 或 Antlr。

对于您想要的内容,这听起来可能太长和太复杂,但是已经为 GoldParser 编写了语法。做你正在做的事情,一旦语法完成,它实际上很容易。下面是语法的一个例子:
"Name"     = 'Spruce Search Grammar'
"Version" = '1.1'
"About" = 'The search grammar for Spruce TFS MVC frontend'

"Start Symbol" = <Query>

! -------------------------------------------------
! Character Sets
! -------------------------------------------------
{Valid} = {All Valid} - ['-'] - ['OR'] - {Whitespace} - [':'] - ["] - ['']
{Quoted} = {All Valid} - ["] - ['']

! -------------------------------------------------
! Terminals
! -------------------------------------------------
AnyChar = {Valid}+
Or = 'OR'
Negate = ['-']
StringLiteral = '' {Quoted}+ '' | '"' {Quoted}+ '"'

! -- Field-specific terms
Project = 'project' ':'
...
CreatedOn = 'created-on' ':'
ResolvedOn = 'resolved-on' ':'
! -------------------------------------------------
! Rules
! -------------------------------------------------

! The grammar starts below
<Query> ::= <Query> <Keywords> | <Keywords>
<SingleWord> ::= AnyChar

<Keywords> ::= <SingleWord>
| <QuotedString>
| <Or>
| <Negate>
| <FieldTerms>

<Or> ::= <Or> <SingleWord>
| Or Negate
| Or <SingleWord>
| Or <QuotedString>

<Negate> ::= <Negate> Negate <SingleWord>
| <Negate> Negate <QuotedString>
| Negate <SingleWord>
| Negate <QuotedString>

<QuotedString> ::= StringLiteral

<FieldTerms> ::= <FieldTerms> Project | <FieldTerms> Description | <FieldTerms> State
| <FieldTerms> Type | <FieldTerms> Area | <FieldTerms> Iteration
| <FieldTerms> AssignedTo | <FieldTerms> ResolvedBy
| <FieldTerms> ResolvedOn | <FieldTerms> CreatedOn
| Project
| <Description>
| State
| Type
| Area
| Iteration
| CreatedBy
| AssignedTo
| ResolvedBy
| CreatedOn
| ResolvedOn

<Description> ::= <Description> Description | <Description> Description StringLiteral
| Description | Description StringLiteral

这为您提供了对以下内容的搜索支持:

resolved-by:john project:"amazing tfs project"



如果你看 Keywords token ,您可以看到它需要一个单字、一个 OR、一个带引号的字符串或一个否定(非)。当这个定义变得递归时,困难的部分就来了,你在 <Description> 中看到了这一点。部分。

语法称为 EBNF它描述了您的语言的格式。您可以在其中编写一些简单的内容,例如搜索查询解析器,或整个计算机语言。 Goldparser 解析标记的方式会限制您,因为它会提前查找标记 ( LALR ),因此 HTML 和 Wiki 语法等语言将破坏您尝试编写的任何语法,因为这些格式不会强制您关闭标记/ token 。 Antlr为您提供 LL(*) ,它更容易丢失起始标记/ token ,但对于搜索查询解析器而言,您无需担心。

我的语法和 C# 代码的代码文件夹可以在这个 project 中找到。 .

QueryParser是解析搜索字符串的类,语法文件是 .grm 文件,2mb 文件是 Goldparser 优化语法以基本上创建自己的可能性表的方式。 Calitha 是 GoldParser 的 C# 库,很容易实现。如果不写一个更大的答案,就很难准确描述它是如何完成的,但是一旦你编译了语法,它就相当简单了,Goldparser 有一个非常直观的 IDE 来编写语法和大量现有的语法,如 SQL、C#、我相信 Java 甚至是 Perl 正则表达式。

这不是一个 1 小时的快速修复,因为您可以从正则表达式中获得接近 2-3 天的时间,但是您确实学习了“正确”的解析方式。

关于.net - 用于类似 Gmail 的搜索的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598891/

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