防止用逗号分隔的字符串替换已经替换的字符串

时间:2018-06-06 12:29:59

标签: c# 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)

我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:5)

您可以使用,字符来检测单个值

string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
string result = string.Join(",", mainstr.Split(',').Select(x => "SUM("+ x + ")"));

答案 1 :(得分:3)

您可以使用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);

答案 2 :(得分:3)

单个正则表达式替换步骤:

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,它不需要在左边立即使用非逗号字符,(?![^,])是一个负向前瞻,它不需要在搜索短语的右边立即使用非逗号字符

替换模式中的$&会在替换期间插入整个匹配项。

请参阅regex demo online

模式详情

  • \b - 字边界或
  • (?<![^,]) - 负面的背后隐藏,左边不需要非逗号字符
  • (?:NON)? - 一个可选的非捕获组,匹配1或0次NON
  • SALE_REVENUE - 文字子字符串
  • (?![^,]) - 在搜索词组右侧不需要非逗号字符的否定前瞻或
  • \b - (关闭)字边界。

enter image description here

请参阅C# demo

string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
string result = Regex.Replace(mainstr, @"(?<![^,])(?:NON)?SALE_REVENUE(?![^,])", "SUM($&)");
Console.WriteLine(result);

答案 3 :(得分:1)

如果mainstr 始终将是"NONSALE_REVENUE,SALE_REVENUE",那么请使用逗号作为替换操作的一部分,所以请使用:

mainstr = mainstr.Replace(",SALE_REVENUE", ",SUM(SALE_REVENUE)");
mainstr = mainstr.Replace("NONSALE_REVENUE,", "SUM(NONSALE_REVENUE),");

答案 4 :(得分:1)

使用Regex.Replace

string mainstr = "NONSALE_REVENUE,SALE_REVENUE";
string result = Regex.Replace(mainstr, @"\b\w+\b", "SUM($0)");