私はそれを短く簡潔に保つようにしています。SQL 形式でクエリを受け取り、XML を検索するプログラムを作成する必要があります。現在、文字列を論理的な断片に分解して、それらを操作できるようにしようとしています。入力として文字列があり、MatchCollection を出力として取得したいと考えています。
以下のテスト文字列は、単純にするためにユーザーに課す特別な形式であることに注意してください。1 行に 1 つのステートメントのみが許可され、ネストされたクエリは除外されます。
string testString = "りんごを選択 \n dblp から \r 食べた場所 \n すべてをグループ化 \r HAVING NO SHAME \n";
次のパターンで正規表現を使用します。
Regex reg = new Regex(@"(?<select> \A\bselect\b .)" +
@"(?<from> ^\bfrom\b .)" +
@"(?<where> ^\bwhere\b .)" +
@"(?<groupBy> ^\bgroup by\b .)" +
@"(?<having> ^\bhaving\b .)"
, RegexOptions.IgnoreCase | RegexOptions.Multiline
);
私の知る限り、これにより、テスト文字列を持つすべてのグループに一致するはずです。各行の先頭にある「select」とそれに続く改行以外の文字が完全に一致するものを探します。
次に、コレクションを作成します。
MatchCollection matches = reg.Matches(testString);
それが機能することを確認するために、 foreach を使用し、次のように一致を出力しました。
foreach(Match match in matches)
{
Console.WriteLine("Select: {0}", match.Groups["select"]);
//and so on
}
問題は、コレクションが常に空であることです。正規表現のどこかに欠陥があるに違いありませんが、経験が浅すぎて見つけることができません。助けていただけませんか?どうもありがとうございました!
の代わりに .* を使用してみました。そう言われるまで。複数の文字を計算することさえできます。これが問題になる可能性があることは間違いありませんが、交換しても結果が得られません。
正規表現が改行を見つけるまで、定義された単語で始まり、それに追加された文字を含む行を照合するのが非常に難しい理由がわかりません。これは比較的簡単な作業だと思います。