[英]Prevent replacing an already replaced string in comma-separated string
我有一個字符串
string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
我試圖取代NONSALE_REVENUE
用SUM(NONSALE_REVENUE)
和SALE_REVENUE
用SUM(SALE_REVENUE)
我試過的是:
mainstr = mainstr.Replace("SALE_REVENUE", "SUM(SALE_REVENUE)");
mainstr = mainstr.Replace("NONSALE_REVENUE", "SUM(NONSALE_REVENUE)");
這給了我錯誤的結果:
NONSUM(SALE_REVENUE,SUM(SALE_REVENUE
我的預期結果是SUM(NONSALE_REVENUE),SUM(SALE_REVENUE)
我怎樣才能做到這一點?
您可以使用,
焦炭檢測單值
string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
string result = string.Join(",", mainstr.Split(',').Select(x => "SUM("+ x + ")"));
您可以使用RegEx實現此目的
string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
string newString = Regex.Replace(mainstr, @"\bNONSALE_REVENUE\b", "SUM(NONSALE_REVENUE)");
newString = Regex.Replace(newString, @"\bSALE_REVENUE\b", "SUM(SALE_REVENUE)");
Console.WriteLine(newString);
單個正則表達式替換步驟:
Regex.Replace(mainstr, @"(?:NON)?SALE_REVENUE", "SUM($&)")
如果要確保替換整個單詞,請用\\b
(單詞邊界)將模式括起來:
Regex.Replace(mainstr, @"\b(?:NON)?SALE_REVENUE\b", "SUM($&)")
或者, 如果僅匹配逗號之間和/或字符串開頭/結尾處的子字符串很重要 ,請使用
Regex.Replace(mainstr, @"(?<![^,])(?:NON)?SALE_REVENUE(?![^,])", "SUM($&)")
其中(?<![^,])
是一個負面的lookbehind,它不需要在左邊立即使用非逗號字符,而(?![^,])
是一個負向前瞻,它不需要立即向右的非逗號字符串搜索短語。
替換模式中的$&
在替換期間插入整個匹配。
圖案細節
\\b
- 單詞邊界或 (?<![^,])
- 一個負面的lookbehind,它不需要在左邊立即使用非逗號字符 (?:NON)?
- 可選的非捕獲組,匹配1或0次NON
SALE_REVENUE
- 文字子字符串 (?![^,])
- 一個負向前瞻,在搜索短語的右邊不需要非逗號字符或 \\b
- (結束)字邊界。 查看C#演示 :
string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
string result = Regex.Replace(mainstr, @"(?<![^,])(?:NON)?SALE_REVENUE(?![^,])", "SUM($&)");
Console.WriteLine(result);
如果mainstr
總是 "NONSALE_REVENUE,SALE_REVENUE"
,那么使用逗號作為替換操作的一部分,所以使用:
mainstr = mainstr.Replace(",SALE_REVENUE", ",SUM(SALE_REVENUE)");
mainstr = mainstr.Replace("NONSALE_REVENUE,", "SUM(NONSALE_REVENUE),");
使用Regex.Replace
:
string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
string result = Regex.Replace(mainstr, @"\b\w+\b", "SUM($0)");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.