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"
個
我想解決的問題是:
- 從輸出中刪除靜態的「場」的前綴。
- 在「FieldNN」部件上設置正則表達式不區分大小寫,而不是小寫引用的文本部分。
- 使正則表達式更健壯,以便引用的字符串可以使用雙引號或單引號。
- 使正則表達式的更穩健,這樣的空格被忽略:FieldNN =「AAA」與FieldNN =「AAA」
我真的只需要解決的第一個問題,其他三將是一個獎金,但一旦我發現了正確的空格和引號模式,我可以修復這些問題。
更新
我覺得下面的模式解決問題2和4
result = Regex.Replace(searchTerm, @"(?<=\b(?i:field)).*?(?=\s*\=)", delegate(Match Match)
我不完全理解你的第二和第三個問題 - 2)現在正則表達式是不區分大小寫的。 3)你不改變值部分,所以你需要將它包含在正則表達式中? –
@ Yevgeniy.Chernobrivets 2)是的,它是不區分大小寫的,但它也降低了引用的字符串。 3)我不改變價值的一部分,但我擔心這個模式會匹配一個FieldNN的價值部分(如果表達太貪婪?) – hairyone