2012-07-25 51 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(), "")); 
相关问题