2012-07-25 50 views
0

我想知道什麼是指定像字符數組的最佳方式消除任何字符,檢查,並在一個字符串

{ 
} 
[ 
] 

,然後檢查字符串對於這些,如果他們那裏,徹底刪除它們。

 if (compiler.Parser.GetErrors().Count == 0) 
     { 
      AstNode root = compiler.Parse(phrase.ToLower()); 
      if (compiler.Parser.GetErrors().Count == 0) 
      { 
       try 
       { 
        fTextSearch = SearchGrammar.ConvertQuery(root, SearchGrammar.TermType.Inflectional); 
       } 
       catch 
       { 
        fTextSearch = phrase; 
       } 
      } 
      else 
      { 
       fTextSearch = phrase; 
      } 
     } 
     else 
     { 
      fTextSearch = phrase; 
     } 

     string[] brackets = brackets = new string[] 
     { 
      "{", 
      "}", 
      "[", 
      "]" 
     }; 

     string[] errorChars = errorChars = new string[] 
     { 
      "'", 
      "&" 
     }; 

     StringBuilder sb = new StringBuilder(); 

     string[] splitString = fTextSearch.Split(errorChars, StringSplitOptions.None); 

     int numNewCharactersAdded = 0; 
     foreach (string itm in splitString) 
     { 
      sb.Append(itm); //append string 
      if (fTextSearch.Length > (sb.Length - numNewCharactersAdded)) 
      { 
       sb.Append(fTextSearch[sb.Length - numNewCharactersAdded]); //append splitting character 
       sb.Append(fTextSearch[sb.Length - numNewCharactersAdded - 1]); //append it again 
       numNewCharactersAdded++; 
      } 
     } 

     string newString = sb.ToString(); 

回答

11

正則表達式可以更輕鬆地做到這一點:

var result = Regex.Replace(input, @"[[\]()]", ""); 

使用字符集([...])匹配其中任何字符並將其替換爲無。 Regex.Replace將取代所有比賽。

+0

你不需要逃避第二個開放方括號嗎? (以及圓括號) '@「[\ [\] \(\)]」'? – James 2012-07-25 15:30:23

+2

@詹姆斯否:字符類中的元字符集遠小於外部(例如,'[。]'將與某個句點匹配)。 – Richard 2012-07-25 15:31:48

0

如何:

string myString = "a12{drr[ferr]vgb}rtg"; 
myString = myString.Replace("[", "").Replace("{", "").Replace("]", "").Replace("}", ""); 

你結了:

a12drrferrvgbrtg

+1

不知'如果有一個顯著數量StringBuilder.Replace'可能會更好被刪除的字符?它肯定會避免方法鏈中的中間值。也許只有一個問題,如果這是一個循環的輸入是很長的。 – Richard 2012-07-25 15:33:29

+0

公平點,你的答案反正更好哈哈,我還沒有花時間學習正則表達式呢,應該真的這麼做! – JMK 2012-07-25 15:36:34

0

我不知道如果我理解你的問題,但你可以用這個解決您的問題:

string toRemove = "{}[]"; 
string result = your_string_to_be_searched; 
foreach(char c in toRemove) 
    result = result.Replace(c.ToString(), ""); 

或擴展方法

static class Extensions 
{ 
    public static string RemoveAll(this string src, string chars) 
    { 
     foreach(char c in chars) 
      src= src.Replace(c.ToString(), ""); 
     return src; 
    } 
} 

有了這個,你可以使用string result = your_string_to_be_searched.RemoveAll("{}[]");

+0

沒有'String.Replace(char,string)'重載:你是否遺漏了'ToString'? – Richard 2012-07-25 15:29:47

+0

@理查德:是的,我不得不編輯我的答案,增加另一部分。但你的答案是唯一的:)謝謝 – Marco 2012-07-25 15:33:55

6

另一個簡明的方法是使用Enumerable.Except來獲得字符集的差異(假設brackets是字符):

String newString = new String(oldString.Except(brackets).ToArray()); 
2
string str = "faslkjnro(fjrmn){ferqwe}{{"; 
char[] separators = new []{'[', ']','{','}' }; 
var sb = new StringBuilder(); 
foreach (var c in str) 
{ 
    if (!separators.Contains(c)) 
    { 
     sb.Append(c); 
    } 
} 

return sb.ToString(); 
0
string charsToRemove = @"[]{}"; 
string pattern = string.Format("[{0}]", Regex.Escape(charsToRemove)); 
var result = Regex.Replace(input, pattern, ""); 

該上一些其他類似的答案的主要優點是,你是不是確定哪些字符需要在正則表達式來進行轉義困擾;你可以讓圖書館爲你照顧。

+0

鑑於字符類中的元字符集與外部不同(例如,'[。]'只匹配句點字符)我不確定'Regex.Escape'會執行在所有情況下都是對的。 – Richard 2012-07-25 15:35:34

+0

@Richard它可能會逃避不需要的角色,但逃避不需要的角色不會導致它無法正常工作。這組字符需要被轉義的事實使得它更容易混淆,因此更有用的是不需要自己去思考它。如果您可以找到一組使用此代碼無法工作的輸入,那麼我會生命的瞭解它。 – Servy 2012-07-25 15:40:04

+0

更多在轉義「無效字符列表」到字符串中時發生意外衝突的情況。 (考慮'\'和'b'在該列表中。)這是一個案例,雖然我不能立即想到問題的情況下,我不能確定沒有這樣的組合(因此,爲什麼我沒有通過回答來概括)。 – Richard 2012-07-25 15:44:28

0

您可以在一個非常緊湊的方式做到這一點是這樣的:

string s = "ab{c[d]}"; 
char[] ca = new char[] {'{', '}', '[', ']'}; 
Array.ForEach(ca, e => s = s.Replace(e.ToString(), "")); 

或者這樣:

StringBuilder s = new StringBuilder("ab{c[d]}"); 
char[] ca = new char[] {'{', '}', '[', ']'}; 
Array.ForEach(ca, e => s.Replace(e.ToString(), "")); 
相關問題