替换字符,但前提是它们符合语句

时间:2018-06-15 09:49:28

标签: c# string

首先,我必须告诉我,我可以找到一个更好的头衔,但我不能,只知道我至少尝试过。无论如何,我正在讨论这个问题...

所以我有一个很像这样的字符串:

"<aaa+aaa<aaa+aaa><aaa+aaa>><aaa+aaa>"

我要替换“&lt;”到“{”,“&gt;” “}”和“+”到“=”。这会是这样的:

"{aaa=aaa{aaa=aaa}{aaa=aaa}}{aaa=aaa}"

但我不想要这样。我想要一些不同的东西,我甚至无法用语言表达对不起。但是当你看到它时,你肯定会得到它。我想要这个:

"{aaa=aaa<aaa+aaa><aaa+aaa>}{aaa=aaa}"

我是C#的新手。我已经花了好几个小时,真的。即使我已经接近成功,我仍然缺少一些东西,因此,它不起作用。

我可以在这里显示我当前的代码,但我认为与你们分享基本上太长了。最少,我可以说我使用了String.InsertString.Remove来实现这一目标。然而,这一切都开始令人困惑,所以我决定告诉你。

提前致谢。

编辑:有些人想要更好的解释和更多示例。我会再给出一些例子,因为我对另一个人不好。

"<+<+>><+<+><>><+><+<<>>>"

为:

"{=<+>}{=<+><>}{=}{=<<>>}"

编辑2: 一个名叫LasseVågsætherKarlsen的好人帮我找到了解释,谢谢:

  

我希望顶级<>替换为{},但嵌套不应该,+到{{ 1}}仅在顶级=<内,但不在嵌套括号内。

2 个答案:

答案 0 :(得分:1)

这可能会有所帮助:

using System.IO;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        string input = "<aaa+aaa<aaa+aaa><aaa+aaa>><aaa+aaa>";

        int countOpenings = 0;

        // we use a StringBuilder because strings are immutable
        StringBuilder sb = new StringBuilder(input);

        for(int i = 0; i < sb.Length; i++)
        {
            // everytime we encounter '<', it's a new opening
            if(sb[i] == '<')
            {
                countOpenings++;
                // if it's the first opening, we change it to '{'
                if(countOpenings == 1)
                {
                    sb[i] = '{';
                }
            }
            // everytime we encounter '>' it means we get out of a block
            else if(sb[i] == '>')
            {
                countOpenings--;
                // if the '>' matches the first opening, we change it to '}'
                if(countOpenings == 0)
                {
                    sb[i] = '}';
                }
            }
            else if(sb[i] == '+' && countOpenings == 1)
            {
                sb[i] = '=';
            }
        }

        Console.WriteLine(sb.ToString());
    }
}

但请注意,如果输入字符串格式错误(例如<>的数量不同),则可能会失败。

答案 1 :(得分:1)

它应该是这样的:

public static string Transform(string str)
{
    int lvl = 0;

    var sb = new StringBuilder(str.Length);

    for (int i = 0; i < str.Length; i++)
    {
        char ch = str[i];

        switch (ch)
        {
            case '<':
                if (lvl == 0)
                {
                    ch = '{';
                }
                lvl++;
                break;
            case '>':
                if (lvl == 0)
                {
                    throw new Exception($"Malformed string at pos {i}");
                }
                else if (lvl == 1)
                {
                    ch = '}';
                }
                lvl--;
                break;
            case '+':
                if (lvl == 1)
                {
                    ch = '=';
                }
                break;
        }

        sb.Append(ch);
    }

    return sb.ToString();
}

最后,您有一个嵌套级别lvl。您希望<{的转换只有在您lvl == 0>}时才会发生{}} 1}}将变为0(所以只有当你在lvl时)。您希望仅在lvl 1时将+更改为=

使用它像:

lvl 1