2011-09-01 66 views
109

是否有更好的方法來替換字符串?替換字符串中的多個字符

我很驚訝,替換不採取字符數組或字符串數​​組。我想我可以寫自己的擴展名,但是我很好奇是否有更好的方法來完成以下工作?注意最後的Replace是一個字符串而不是一個字符。

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

謝謝。

回答

141

您可以使用替換正則表達式。

s/[;,\t\r ]|[\n]{2}/\n/g 
  • s/開頭指搜索
  • []之間的字符是要搜索的(以任何次序)
  • 第二/界定搜索的文本和字符替換文本

在英語中,這個寫着:

「搜索;,\t\r(空間)或恰好兩個連續\n\n替換爲」

在C#中,你可以做到以下幾點:(進口System.Text.RegularExpressions後)

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

'\ t'和'\ r'都包含在'\ s'。所以你的正則表達式相當於'[;,\ s]'。 – NullUserException

+2

而'\ s'實際上等同於'[\ f \ n \ r \ t \ v]',所以你在那裏包含了一些原始問題中沒有的東西。另外,原始問題要求替換(「\ n \ n」,「\ n」)'您的正則表達式不處理。 – NullUserException

+0

不知道爲什麼RegEx逃脫了我的想法......謝謝。 – zgirod

0

使用RegEx.Replace,這樣的事情:

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

下面是關於這MSDN documentation for RegEx.Replace

85

更多信息如果你感覺特別聰明,不希望使用正則表達式:

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"); 
+2

+1,我希望你不介意,但我在我的博客文章中使用了一個稍微修改過的方法。 http://learncsharp.org/how-to-properly-and-safely-access-a-database-with-ado-net/ –

41

你可以使用Linq的聚合函數:

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)); 
} 
13

這是最簡單的辦法:

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

這一個班輪也有助於當你需要這個初始化。 –

5

噢噢噢,性能恐怖! 答案有點過時,但仍然...

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(); 
    } 
} 
0

性能 - 明智這可能可能不是最好的解決方案,但它的工作原理。

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

字符串本身就是不可變的字符數組

你只需要使其變更:由unsafe世界使用StringBuilder

    • 無論是與指針玩(危險雖然)

    並嘗試遍歷最少次數的字符數組。

    與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();