1

这是我当前的代码:

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

但是,我相信应该可以一次性完成,可能使用正则表达式排除功能,但我不知道如何。

4

2 回答 2

0

你想要的是非捕获组。形成您的正则表达式,以便您可以根据正则表达式中的(仅捕获)组来编写最终表达式。然后调用 Regex.Replace 排除非捕获组。在此处查看我使用此技术的其他答案。

于 2013-08-26T15:07:04.160 回答
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,它确保第一个匹配之前的字符不是引号。

(?![""'])是一个否定的lookahead,有点类似于lookbehind,除了它检查后面的字符。

于 2013-08-26T15:07:28.020 回答