首先,我必须告诉我,我可以找到一个更好的头衔,但我不能,只知道我至少尝试过。无论如何,我正在讨论这个问题...
所以我有一个很像这样的字符串:
"<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.Insert
和String.Remove
来实现这一目标。然而,这一切都开始令人困惑,所以我决定告诉你。
提前致谢。
编辑:有些人想要更好的解释和更多示例。我会再给出一些例子,因为我对另一个人不好。
"<+<+>><+<+><>><+><+<<>>>"
为:
"{=<+>}{=<+><>}{=}{=<<>>}"
编辑2: 一个名叫LasseVågsætherKarlsen的好人帮我找到了解释,谢谢:
我希望顶级
<
和>
替换为{
和}
,但嵌套不应该,+
到{{ 1}}仅在顶级=
和<
内,但不在嵌套括号内。
答案 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