如何排除C#Regex中的某些字符串?

如何排除C#Regex中的某些字符串?,c#,regex,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-

这是我当前的代码:

        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");
        }

然而,我相信一次完成应该是可能的,可能使用regex exclude特性,但我不知道怎么做。

您想要的是什么。形成您的正则表达式,以便您可以根据正则表达式中的(仅捕获)组编写最终表达式。然后调用Regex.Replace,排除非捕获组。请参阅我的另一个使用此技巧的答案。

您或许可以使用负面环视和单词边界来帮助:

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

(?![“”])
是一种负向前看,有点类似于向后看,只是它检查以下字符。

非常感谢。顺便说一下,要使用@避免双转义,您需要使用“”来转义引号,因此:formula=Regex.Replace(formula,@)(?@miliu哦,你说得对,谢谢你指出这一点,我会马上纠正的。)另外,不客气!我对C#还不太熟悉。谢谢你解释了lookback和lookahead。我刚刚学到的另一件事是,我通常会在方括号内放置一个分隔字符的条(所以[“|”),但显然这不是必需的。@miliu哦,不,不要将管道(或条)放在方括号中,因为您的正则表达式将匹配它们。
[a | b]
将匹配所有
a
b
|
。在正则表达式中通常需要转义的大多数字符在放在方括号内时会丢失其特殊字符,并成为文字,但有时,有些字符需要转义以保持文字,如此处的引号。谢谢您的回答,但我不明白如何不使用captur在这种情况下,ing集团可以帮助我。
formula = Regex.Replace(formula, @"(?<![""'])\b[a-zA-Z]\w+\.[a-zA-Z_]\w*\b(?![""'])", "field(\"$0\")");