Remove a defined part from a string

Lets say I have this string:

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

I want to take away everything within the brackets so it turns out like this:

"Hi my name is Bob". 

So for I've tried with this and I know I've been think wrong with the while-loop but I just can't figure it out.

    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();
    }
Jon Skeet
people
quotationmark

Look at this loop:

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

That will continue executing until the condition isn't met. Given that you're not changing text[i], it's never going to stop...

Additionally, you're calling ToString on a char[] which isn't going to do what you want, and even if it did you'd have left-over characters.

If you wanted to loop like this, I'd use a StringBuilder, and just keep track of whether you're "in" an angle bracket or not:

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

Alternatively, use a regular expression. It would be relatively tricky to get it to cope with nested angle brackets, but if you don't need that, it's really simple:

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

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

One last problem though - after removing the angle-bracketed-text from "Hi my name is <crazy> Bob" you actually get "Hi my name is Bob" - note the double space.

people

See more on this question at Stackoverflow