如何在C#Regex中排除一些字符串?

时间:2013-08-26 14:55:30

标签: c# regex

这是我目前的代码:

        var formula = "Scan: \"sample.test\" OR 'batch.id' AND if (results.tune)))";
        if (formula.IndexOf("field(", StringComparison.OrdinalIgnoreCase) == -1)
        {
            formula = Regex.Replace(formula, "[a-zA-Z]\\w+\\.[a-zA-Z_]\\w*", "field(\"$0\")");
        }

输出如下:

"Scan: \"field(\"sample.test\")\" OR 'field(\"batch.id\")' AND if (field(\"results.tune\"))))"

但是,我想跳过前两场比赛。因此,如果引用一个术语,请不要替换它。预期输出应如下所示:

"Scan: \"sample.test\" OR 'batch.id' AND if (field(\"results.tune\"))))"

我设法通过两次传递获得预期结果:

        var formula = "Scan: \"sample.test\" OR 'batch.id' AND if (results.tune)))";
        if (formula.IndexOf("field(", StringComparison.OrdinalIgnoreCase) == -1)
        {
            formula = Regex.Replace(formula, "[a-zA-Z]\\w+\\.[a-zA-Z_]\\w*", "field(\"$0\")");
            formula = Regex.Replace(formula, "([\"|'])field\\(\"([a-zA-Z]\\w+\\.[a-zA-Z_]\\w*)\"\\)\\1", "$1$2$1");
        }

但是,我认为应该可以一次性完成,可能使用正则表达式排除功能,但我无法弄清楚如何。

2 个答案:

答案 0 :(得分:0)

你想要的是non-capturing groups。形成你的正则表达式,这样你就可以用正则表达式中的(仅捕获)组来编写最终表达式。然后调用Regex.Replace,排除非捕获组。请参阅我使用此技术的其他答案here

答案 1 :(得分:0)

您可以使用负面外观和字边界来提供帮助:

(?<![""'])\b[a-zA-Z]\w+\.[a-zA-Z_]\w*\b(?![""'])

此外,您可以使用@来避免双重逃避许多事情:

formula = Regex.Replace(formula, @"(?<![""'])\b[a-zA-Z]\w+\.[a-zA-Z_]\w*\b(?![""'])", "field(\"$0\")");

(?<![""'])是一个负面的背后隐藏,可以确保第一场比赛前的角色不是引用。

(?![""'])是一个负向前瞻,有点类似于lookbehind,除了它检查以下字符。