从字符串中删除已定义的部分

本文关键字:定义 字符串 删除 | 更新日期: 2023-09-27 18:04:46

假设我有这个字符串:

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

我想去掉括号内的所有内容,结果是这样的:

"Hi my name is Bob". 

所以,我已经尝试过了,我知道我一直认为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();
    }

从字符串中删除已定义的部分

试试这个Regex:

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

看看这个循环:

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

它将继续执行,直到条件不满足为止。假设你没有改变text[i],它永远不会停止。。。

此外,您在char[]上调用ToString,它不会执行您想要的操作,即使执行了,也会留下字符。

如果你想这样循环,我会使用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"——注意双空格。

使用

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

我推荐使用regex。

public static string DoIt(string content, string from, string to)
{
    string regex = $"(''{from})(.*)(''{to})";
    return Regex.Replace(content, regex, "");
}