replacestring中的多个字符

有没有更好的方法来取代string?

我感到惊讶的是,replace不采取字符数组或string数​​组。 我想我可以写自己的扩展名,但是我很好奇是否有更好的方法来完成以下工作? 注意最后一个Replace是一个string而不是一个字符。

myString.Replace(';', '\n').Replace(',', '\n').Replace('\r', '\n').Replace('\t', '\n').Replace(' ', '\n').Replace("\n\n", "\n"); 

谢谢。

您可以使用replace正则expression式。

 s/[;,\t\r ]|[\n]{2}/\n/g 
  • s/开始意味着search
  • []之间的字符是要search的字符(以任何顺序)
  • 第二个/分隔search文本和replace文本

用英文写道:

“search;,\t\r (空格)或正好两个连续的\n并将其replace为\n

在C#中,您可以执行以下操作:(导入System.Text.RegularExpressions

 Regex pattern = new Regex("[;,\t\r ]|[\n]{2}"); pattern.Replace(myString, "\n"); 

如果你感觉特别聪明,不想使用正则expression式:

 char[] separators = new char[]{' ',';',',','\r','\t','\n'}; string s = "this;is,\ra\t\n\n\ntest"; string[] temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); s = String.Join("\n", temp); 

你也可以用一个扩展方法来包装这个。

编辑:或者等待2分钟,我最终会写出来:)

 public static class ExtensionMethods { public static string Replace(this string s, char[] separators, string newVal) { string[] temp; temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); return String.Join( newVal, temp ); } } 

呃…

 char[] separators = new char[]{' ',';',',','\r','\t','\n'}; string s = "this;is,\ra\t\n\n\ntest"; s = s.Replace(separators, "\n"); 

你可以使用Linq的Aggregate函数:

 string s = "the\nquick\tbrown\rdog,jumped;over the lazy fox."; char[] chars = new char[] { ' ', ';', ',', '\r', '\t', '\n' }; string snew = chars.Aggregate(s, (c1, c2) => c1.Replace(c2, '\n')); 

这是扩展方法:

 public static string ReplaceAll(this string seed, char[] chars, char replacementCharacter) { return chars.Aggregate(seed, (str, cItem) => str.Replace(cItem, replacementCharacter)); } 

这是最短的方法:

 myString = Regex.Replace(myString, @"[;,\t\r ]|[\n]{2}", "\n"); 

哦,performance恐怖! 答案有点过时了,但还是…

 public static class StringUtils { #region Private members [ThreadStatic] private static StringBuilder m_ReplaceSB; private static StringBuilder GetReplaceSB(int capacity) { var result = m_ReplaceSB; if (null == result) { result = new StringBuilder(capacity); m_ReplaceSB = result; } else { result.Clear(); result.EnsureCapacity(capacity); } return result; } public static string ReplaceAny(this string s, char replaceWith, params char[] chars) { if (null == chars) return s; if (null == s) return null; StringBuilder sb = null; for (int i = 0, count = s.Length; i < count; i++) { var temp = s[i]; var replace = false; for (int j = 0, cc = chars.Length; j < cc; j++) if (temp == chars[j]) { if (null == sb) { sb = GetReplaceSB(count); if (i > 0) sb.Append(s, 0, i); } replace = true; break; } if (replace) sb.Append(replaceWith); else if (null != sb) sb.Append(temp); } return null == sb ? s : sb.ToString(); } } 

使用RegEx.Replace,如下所示:

  string input = "This is text with far too much " + "whitespace."; string pattern = "[;,]"; string replacement = "\n"; Regex rgx = new Regex(pattern); 

以下是有关RegEx.Replace的此MSDN文档的更多信息

性能 – 明智这可能可能不是最好的解决scheme,但它的工作原理。

 var str = "filename:with&bad$separators.txt"; char[] charArray = new char[] { '#', '%', '&', '{', '}', '\\', '<', '>', '*', '?', '/', ' ', '$', '!', '\'', '"', ':', '@' }; foreach (var singleChar in charArray) { str = str.Replace(singleChar, '_'); } 

string只是不可变的字符数组

你只需要使其变得可变:

  • 要么使用StringBuilder
  • 进入unsafe世界,玩指点(尽pipe危险)

并尝试遍历最less次数的字符数组。

示例与StringBuilder

  public static void MultiReplace(this StringBuilder builder, char[] toReplace, char replacement) { HashSet<char> set = new HashSet<char>(toReplace); for (int i = 0; i < builder.Length; ++i) { var currentCharacter = builder[i]; if (set.Contains(currentCharacter)) { builder[i] = replacement; } } } 

那么你只需要像这样使用它:

 var builder = new StringBuilder("my bad,url&slugs"); builder.MultiReplace(new []{' ', '&', ','}, '-'); var result = builder.ToString();