正则表达式替换匹配函数并删除其他匹配项

时间:2014-01-28 20:22:11

标签: c# regex matchevaluator

我有一个类似下面的字符串,我想用一个函数的输出替换FieldNN实例。

到目前为止,我已经能够用函数的输出替换NN实例。但我不确定如何删除具有相同正则表达式的静态“字段”部分。

输入字符串:

(Field30="2010002257") and Field1="yuan" not Field28="AAA"

必需的输出:

(IncidentId="2010002257") and Author="yuan" not Recipient="AAA"

这是我到目前为止的代码:

public string translateSearchTerm(string searchTerm) {
    string result = "";

    result = Regex.Replace(searchTerm.ToLower(), @"(?<=field).*?(?=\=)", delegate(Match Match) {
        string fieldId = Match.ToString();
        return String.Format("_{0}", getFieldName(Convert.ToInt64(fieldId)));
    });

    log.Info(String.Format("result={0}", result));

    return result;
}

给出:

(field_IncidentId="2010002257") and field_Author="yuan" not field_Recipient="aaa"

我想解决的问题是:

  1. 从输出中删除静态“字段”前缀。
  2. 在“FieldNN”部分使正则表达式不区分,而不是小写引用的文本部分。
  3. 使正则表达式更加健壮,以便引用的字符串可以使用双引号或单引号。
  4. 使正则表达式更加健壮,以便忽略空格:FieldNN =“AAA”vs. FieldNN =“AAA”
  5. 我真的只需要解决第一个问题,其他三个是奖励,但是一旦我找到了正确的空格和引号模式,我就可以解决这些问题。

    更新

    我认为下面的模式解决了问题2.和4.

    result = Regex.Replace(searchTerm, @"(?<=\b(?i:field)).*?(?=\s*\=)", delegate(Match Match) 
    

1 个答案:

答案 0 :(得分:0)

要修复第一个问题,请使用组而不是正面的后视:

public string translateSearchTerm(string searchTerm) {
    string result = "";

    result = Regex.Replace(searchTerm.ToLower(), @"field(.*?)(?=\=)", delegate(Match Match) {
        string fieldId = Match.Groups[1].Value;
        return getFieldName(Convert.ToInt64(fieldId));
    });

    log.Info(String.Format("result={0}", result));

    return result;
}

在这种情况下,“field”前缀将包含在每个匹配中,并将被替换。