2014-05-22 5 views
2

Допустим, у меня есть эта строка:Удалить определенную часть из строки

string text = "Hi my name is <crazy> Bob"; 

Я хочу, чтобы забрать все, что в скобках, так получается так:

"Hi my name is Bob". 

Так что для I Я попытался с этим, и я знаю, что я ошибался в цикле while, но я просто не могу понять это.

public static string Remove(string text) 
    { 
     char[] result = new char[text.Length]; 

     for (int i = 0; i < text.Length; i++) 
     { 
      if (text[i] == '<') 
      { 
       while (text[i] != '>') 
       { 
        result[i] += text[i]; 
       } 
      } 
      else 
      { 
       result[i] += text[i]; 
      } 
     } 
     return result.ToString(); 
    } 
+0

вид регулярных выражений – mrida

+0

http://stackoverflow.com/questions/1359412/c-sharp-remove-text-in-between -delimiters-in-a-string-regex – KopBuH

+0

Может ли вход быть 'Привет, мое имя дядя Bob.'? Должен ли он удалять только «сумасшедший» и «странный» или «дядя»? –

ответ

7

Посмотрите на эту петлю:

while (text[i] != '>') 
{ 
    result[i] += text[i]; 
} 

Это будет продолжать выполнение, пока условие не выполнено. Учитывая, что вы не меняете text[i], он никогда не собирается останавливаться ...

Кроме того, вы звоните ToString на char[], который не собирается делать то, что вы хотите, и даже если бы это было вы бы имеют оставшиеся символы.

Если вы хотите, чтобы петли, как это, я бы использовать StringBuilder, и просто следить за ли вы «в» угловой кронштейн или нет:

public static string RemoveAngleBracketedContent(string text) 
{ 
    var builder = new StringBuilder(); 
    int depth = 0; 
    foreach (var character in text) 
    { 
     if (character == '<') 
     { 
      depth++; 
     } 
     else if (character == '>' && depth > 0) 
     { 
      depth--; 
     } 
     else if (depth == 0) 
     { 
      builder.Append(character); 
     } 
    } 
    return builder.ToString(); 
} 

В качестве альтернативы, используйте регулярное выражение , Было бы довольно сложно, чтобы получить его, чтобы справиться с вложенными угловыми скобками, но если вам не нужно, что это действительно просто:

// You can reuse this every time 
private static Regex AngleBracketPattern = new Regex("<[^>]*>"); 
... 

text = AngleBracketPattern.Replace(text, ""); 

Одна последняя проблема, хотя - после снятия угловой скобки-текст с "Hi my name is <crazy> Bob" вы фактически получаете "Hi my name is Bob" - обратите внимание на двойное пространство.

+1

+1 Для того, чтобы дать ОП и пресловутый урок рыба и рыбу! – DaveParsons

11

Попробуйте Regex:

public static string Remove(string text) 
{ 
    return Regex.Replace(text, "<.*?>",""); 
} 
+0

dang ... мой ввод не достаточно быстрый! –

+0

черт возьми - избил меня, как 2 секунды! –

+2

Это отличная альтернатива, но это не помогает ОП понять, почему их попытка решения не работает. – DaveParsons

2

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

string text = "Hi my name is <crazy> Bob"; 
text = System.Text.RegularExpressions.Regex.Replace(text, "<.*?>",string.Empty); 
+0

Ответ такой же, как @Sriram Sakthivel ответить –

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