2015-01-15 3 views
4

Я использую .NET Micro Framework 4.1, который не реализует класс Regex или методы String.Replace/String.Remove, насколько мне известно.Как удалить все вхождения символа/подстроки?

я строка определяется как:

string message = "[esc]vI AM A STRING. [esc]vI AM A STRING AND DO LOTS OF THINGS..."; 

Есть ли способ удалить все вхождения [esc]v из этой строки? Где используется escape-символ (0x1B), а затем 0x76 в NetMF?

Это, надеюсь, оставить меня:

string message = "I AM A STRING. I AM A STRING AND DO LOTS OF THINGS..."; 

Я думал, возможно, с использованием метода String.Split(), но это, кажется, слишком требовательные к памяти, как код работает на малой memoried плате NETMF.

ответ

2

Использование

StringBuilder.Replace 
StringBuilder.Remove 

которые являются available в .NET Framework Micro версии 2,5, 3,0, 4,0 и 4,1.

 public static string fixStr(string message, char c) 
     { 
      StringBuilder aStr = new StringBuilder(message); 
      for (int i = 0; i < aStr.Length; i++) 
      { 
      if (aStr[i] == c) 
      { 
       aStr.Remove(i, 1); 
      } 
      } 
      return aStr.ToString(); 
     } 

Использование:

 string message = "" + (char)0x1B + (char)0x76 + "I AM A STRING. " + (char)0x1B + (char)0x76 + "I AM A STRING AND DO LOTS OF THINGS..."; 

     message = fixStr(message, (char)0x76); 
     message = fixStr(message, (char)0x1B); 
2

Расширения? Попробуйте

public static string Replace(this string stringToSearch, char charToFind, char charToSubstitute) 
{   
    char[] chars = stringToSearch.ToCharArray(); 
    for (int i = 0; i < chars.Length; i++) 
     if (chars[i] == charToFind) chars[i] = charToSubstitute; 

    return new string(chars); 
} 
+0

Это не будет _remove_ персонажей. – CodeCaster

+0

@CodeCaster: Какой подход будет * вы принимаете? – jbutler483

+0

@jbutler Я не совсем специалист по ограниченным ресурсам, поэтому я просто создаю новый массив того же размера, копируем действительные символы и сохраняем счетчик для новой длины. Или сохраните 'removedCharsCount' и сделайте' chars [i - removedCharsCount] = chars [i] ', увеличивая этот счетчик каждый раз, когда встречается символ для удаления. Но см. Также [Самый быстрый способ удаления символов из строки] (http://stackoverflow.com/questions/2182459/fastest-way-to-remove-chars-from-string). – CodeCaster

1

я был в конечном итоге удалось выяснить, как достичь этого другим способом.

Однако я впервые использовал метод похож на @ ответ Filip в:

Я использовал:

String message = "[esc]vI AM A STRING. [esc]vI AM A STRING AND DO LOTS OF THINGS..."; 

byte [] msg = System.Text.Encoding.UTF8.GetBytes(message); 
for(int i=0; i< msg.Length; i++) 
{ 
    if (msg[i] ==0x1B || msg[i] == 0x76) msg[i] = 0x00; 
} 
//msg is now in byte[] format 

я мог бы тогда продолжал переконвертировать это в мою строку с помощью

message = new string(System.Text.Encoding.UTF8.getChars(msg)); 

Хотя, для моего проекта, я смог оставить его в формате byte[].


Однако в свете моей ситуации, (так как я читал из последовательного порта - не упомянутый в вопросе, я знаю, так как не думаю, что это было важно), я был в состоянии просто «остановить» эти символы вводимой в строку, в первую очередь, с помощью:

if(buffer[0] !=0x1B && buffer[0] !=0x76) 
{ 
    //add to string since it's not either 
} 

Я был в состоянии сделать это, так как «хотел» персонажи были все в верхнем регистре, и поэтому «v» будет никогда не появляется в сообщении.


Однако, я все еще был бы интересно, если там был лучший способ из удаления обугленного/подстроки, если необходимость в возникшие будущем.

Смежные вопросы