LINQPad与.NET正则表达式性能不匹配

时间:2012-11-08 18:28:15

标签: c# regex linqpad

全部,我有一系列的SQL语句分别在string和'GO'中分开(不区分大小写,因此'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'中'去'的比赛。为此,我在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#app中

为什么缺点和我做错了什么?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

我能够让你的示例在LinqPad和Console应用程序中工作。

建议简化你的正则表达式并避免使用后面的观察并向前看是使用这样的单词边界:

  

\b(?i)GO\b

这将实现相同的结果并且更具可读性。

答案 1 :(得分:0)

只是一个小建议:

请改用以下正则表达式:

^GO$

仅当它是一行中的第一个和最后一个字符串时才匹配GO