-1

正規表現に頭を悩ませている問題がいくつかあります。

次のタイプの文字列があり、データを解析/取得する必要があります

'Account'.Search = "[Id] is NULL OR NAME = ""0%"""
'Account'.Sort = "NAME, Address"
'Bank Objectives'.Search = "[Active Flg] = "Y""
'Bank'.Search = "[Id] is NULL"
'Bank'.Sort = "Transit"
'Bank Goals'.Search = "[Active Flg] = 'Y'"
.......

次の式が機能するようです

\s*(?:(?<search>(?:(=['"])?(?:.*)\1|.*)\.Search[^"']*(?:(=['"])?(?:.*)\1|.*))\s*$?(?<sort>(?:(=['"])?(?:.*)\1|.*)\.Sort[^"']*(?:(=['"])?(?:.*)\1|.*))?\s*$?)

そして、私は次のような出力を得ることができます

search: 'Account'.Search = '[Id] is NULL OR NAME = ''0%'''
sort: 'Account'.Sort = "NAME, Address"
search: 'Bank Objectives'.Search = "[Active Flg] = "Y""
search: 'Bank'.Search = "[Id] is NULL"
sort: 'Bank'.Sort = "Transit"
search: 'Bank Goals'.Search = "[Active Flg] = 'Y'"

ただし、入力文字列に改行がない場合は、取得を開始します

search: 'Account'.Search = '[Id] is NULL OR NAME = ''0%''''Account'.Sort = "NAME, Address"

入力文字列から私が本当に基本的にしているのは

Account
  Search = "[Id] is NULL OR NAME = ""0%"""
  Sort = "NAME, Address"
Bank Objectives 
  Search = "[Id] is NULL OR NAME = ""0%"""
  Sort = ""
.....

また、(=['"])?(?:.*)\1|.*)引用符に一致すると思われますが、どちらも機能していないようです。

最終的な目標は、文字列を式エディターに渡し、[Id] IS NULL or Name =""0%"""ユーザーが変更できるようにしてから、文字列全体の検索部分を更新することです。そのため、ユーザーが で始まるアカウント名bobが必要な場合は、生成する必要があります

'Account'.Search = "Name like 'bob%'"
'Account'.Sort = "NAME, Address"
'Bank Objectives'.Search = "[Active Flg] = "Y""
'Bank'.Search = "[Id] is NULL"
'Bank'.Sort = "Transit"
'Bank Goals'.Search = "[Active Flg] = 'Y'"
.......

私はすでにその作品を構築しています。複数のエントリを持つことができるこの文字列を解析しています。また、文字列には次を含めることができます

"Name like 'bob%'"

したがって、それが実際にあると想定されていたことを理解するのは私に任されています

'Account'.Search = "'bob%' のような名前"

したがって、入力文字列が正規表現と一致するかどうかを知る必要があります

4

1 に答える 1

0

正規表現を使用して 100% の解決策を得ることはまずありません。構文が非常に複雑で、適合しない入力を受け取る可能性がある場合は、字句パーサーを生成する必要があります。.Net でこれを行う方法に関するリソースはたくさんあります。

いくつかのスターター リンクを次に示します。

  • http://stackoverflow.com/questions/1669/learning-to-write-a-compiler
  • http://blogs.microsoft.co.il/blogs/sasha/archive/2010/10/06/writing-a-compiler-in-c-lexical-analysis.aspx
  • http://www.antlr.org/

アップデート:

正規表現を使用する必要がある場合、それをいくつかの小さな問題に分割してみませんか? まず、改行で分割し、各行を個別に解析します。次に、一連の単純な正規表現を使用して文字列を分解します。

たとえば、各行を [obj].[verb] = [rule] に解析するには、次のようにします。
/'(?<obj>[^']+)'.(?<verb>[^\w=]+\)\s*=\s*"(?<rule>.+)"/

次に、次のフィールドのルールを解析します。
/\[[^\]+\]/

于 2013-01-03T22:21:56.383 に答える