0

すべて、「GO」で区切られた一連のSQLステートメントがありますstring(大文字と小文字は区別されないため、「Go」、「go」なども有効です)。私が次のようなステートメントを持っている場合

string str = "INSERT INTO People \r\n" + 
                "VALUES (3, 'Gandalf', 'The Gray'); \r\nGO\r\n" + 
             "INSERT INTO People \r\n" + 
                "VALUES (4, 'Legolas', 'Camus'); \r\nGO";

「レゴラス」の「go」での一致を避けたい。これを行うために、私はLINQPadで、負の先読み正の後読みの両方を持つ 正規表現を考案しました。

string str = "INSERT INTO People \r\n" + 
                "VALUES (3, 'Gandalf', 'The Gray'); \r\nGO\r\n" + 
             "INSERT INTO People \r\n" + 
                "VALUES (4, 'Legolas', 'Camus'); \r\nGO";
Regex regGo = new Regex(@"(?<=\b)(?i)GO(?!\w+)");
MatchCollection matches = regGo.Matches(str);
foreach (Match m in matches)
{
    m.Dump();
}

これは私が望むことを実行します。つまり、新しい「GO」であり、その後に何も続かない場合にのみ、「GO」に一致します。これはLINQPadで機能します。つまり、必要な結果を返します。しかし、私のC#アプリにはありません。

なぜ不明瞭なのか、そして私は何を間違っているのですか?

御時間ありがとうございます。

4

2 に答える 2

1

私はあなたの例をLinqPadとコンソールアプリの両方で動作させることができました。

正規表現を単純化し、後読みと先読みの使用を避けるための提案は、次のような単語境界を使用することです。

\b(?i)GO\b

これにより、同じ結果が得られ、もう少し読みやすくなります。

于 2012-11-08T20:01:55.153 に答える
0

ちょっとした提案:

代わりに、次の正規表現を使用してください。

^GO$

GO行の最初と最後の文字列である場合にのみ一致します。

于 2012-11-08T18:38:16.643 に答える