【发布时间】:2013-05-13 21:18:39
【问题描述】:
基本上,我想取一个字符串,如果连续有多个'+',我想删除除一个之外的所有。所以:
"This++is+an++++ex+ampl++e"
会变成
"This+is+an+ex+ampl+e"
我不确定 LINQ 或 Regex 或其他方法是否最适合,但它不必使用任何特定方法。
【问题讨论】:
基本上,我想取一个字符串,如果连续有多个'+',我想删除除一个之外的所有。所以:
"This++is+an++++ex+ampl++e"
会变成
"This+is+an+ex+ampl+e"
我不确定 LINQ 或 Regex 或其他方法是否最适合,但它不必使用任何特定方法。
【问题讨论】:
Regex.Replace(str, @"\++", "+");
【讨论】:
"This+is+an++ex+ampl+e" 吗?它将用 + 替换每个 ++,但不会将 +++ 或 ++++(等)修复为 +。如果我错了,请纠正我。
+ 是修饰符。 (这就是为什么我需要一个反斜杠)
+,被转义,表示实际的加号,第二个+,表示“一个或多个前一个字符”。因此,它将匹配一个到任意数量的连续加号,并用一个加号替换它们。这就是你想要的。
\+\++ 这样我就只会在有多个 + 的地方替换。
\+{2,}?我觉得我们在这里分不清,但就可维护性而言,我发现\++ 比我们的任何一个答案都更具可读性。
while (str.Contains("++"))
str = str.Replace("++", "+");
【讨论】:
Microsoft 的Interactive Extensions (Ix) 有一个名为DistinctUntilChanged 的方法可以满足您的需求。该库中包含许多有用的功能 - 但它是另一个完整的库,您可能不想打扰。
用法如下:
str = new string(str
.ToEnumerable()
.DistinctUntilChanged()
.ToArray());
如果您只想删除加号,那么您可以这样做:
str = new string(str
.ToEnumerable()
.Select((c, i) => new { c, i = (c != '+' ? i : -1) })
.DistinctUntilChanged()
.Select(t => t.c)
.ToArray());
【讨论】:
有一些方法可以用更少的代码做到这一点(@slaks 向我展示了我需要重新学习正则表达式的程度),但如果你经常这样做,这在大多数情况下应该尽可能快。
public static string RemoveDupes(this string replaceString, char dupeChar){
if(replaceString == null || String.Length < 2){ return replaceString; }
int startOfGood = 0;
StringBuilder result = new StringBuilder();
for(int x = 0;x<replaceString.Length-1;x++){
if(replaceString[x] == dupeChar && replaceString[x+1] == dupeChar){
result.Append(replaceString.SubString(startOfGood,x-startOfGood));//I think this works with length 0
startOfGood = x+1;
}
}
result.Append(replaceString.Substring(startOfGood,
replaceString.Length-startOfGood));
return result.ToString();
}
//Usage:
var noDupes = "This++is+an++++ex+ampl++e".RemoveDupes('+');
【讨论】:
"This++is++a++test++"的索引超出范围异常