正規表現ルートを使用する際に直面する問題は、スペースの問題に遭遇することです。これを行うにはおそらく非常に複雑な正規表現がありますが、単純な正規表現の場合、検索にキーワードのスペースを含めることができないことがわかります。例:
動作:site: mysite user:john
失敗: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
これにより、次のような検索サポートが提供されます。
解決済み-by:johnプロジェクト:"すばらしいtfsプロジェクト"
トークンを見るKeywords
と、単一の単語、OR、引用符で囲まれた文字列、または負の数(NOT)を期待していることがわかります。難しい部分は、この定義が再帰的になるときに発生します。これは、この<Description>
部分に見られます。
構文はEBNFと呼ばれ、言語の形式を記述します。検索クエリパーサーのような単純なもの、またはコンピューター言語全体を記述できます。Goldparserがトークンを解析する方法は、トークン(LALR)を先読みするため、制限されます。そのため、HTMLやWiki構文などの言語では、タグやトークンを閉じる必要がないため、書き込もうとする文法が壊れます。 。AntlrはLL(*)を提供します。これは、開始タグ/トークンの欠落をより許容しますが、検索クエリパーサーについて心配する必要はありません。
私の文法とC#コードのコードフォルダーは、このプロジェクトにあります。
QueryParserは検索文字列を解析するクラスであり、文法ファイルは.grmファイルであり、2mbファイルは、Goldparserが文法を最適化して基本的に独自の可能性のテーブルを作成する方法です。CalithaはGoldParserのC#ライブラリであり、実装が簡単です。さらに大きな答えを書かなければ、それがどのように行われるかを正確に説明するのは難しいですが、文法をコンパイルするとかなり簡単です。Goldparserには、SQL、C#などの既存の文法を含む非常に直感的なIDEがあります。 Java、さらにはPerlの正規表現もあると思います。
正規表現から得られるような1時間の迅速な修正ではありませんが、2〜3日近くかかりますが、「適切な」構文解析の方法を学びます。