0

总而言之,我有一系列string由“GO”分隔的 SQL 语句(不区分大小写,因此“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";

我想避免在“Legolas”中的“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 回答