这是我目前的代码:
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");
}
但是,我认为应该可以一次性完成,可能使用正则表达式排除功能,但我无法弄清楚如何。
答案 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,除了它检查以下字符。