2014-01-28 73 views
0

我有一個像下面的字符串,我想用一個函數的輸出替換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」與FieldNN =「AAA」

我真的只需要解決的第一個問題,其他三將是一個獎金,但一旦我發現了正確的空格和引號模式,我可以修復這些問題。

更新

我覺得下面的模式解決問題2和4

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

我不完全理解你的第二和第三個問題 - 2)現在正則表達式是不區分大小寫的。 3)你不改變值部分,所以你需要將它包含在正則表達式中? –

+0

@ Yevgeniy.Chernobrivets 2)是的,它是不區分大小寫的,但它也降低了引用的字符串。 3)我不改變價值的一部分,但我擔心這個模式會匹配一個FieldNN的價值部分(如果表達太貪婪?) – hairyone

回答

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

在這案件「領域」前綴將包括在每場比賽中並將被替換。

+0

謝謝@ Yevgeniy.Chernobrivets :) – hairyone

相關問題