我想在方括号[]之间删除逗号,而不是从字符串中删除整个逗号。
这是我的字符串,
这是我的字符串,
string result= "a,b,c,[c,d,e],f,g,[h,i,j]";期望的输出为:
a,b,c,[cde],f,g,[hij]提前感谢。
string result= "a,b,c,[c,d,e],f,g,[h,i,j]";期望的输出为:
a,b,c,[cde],f,g,[hij]提前感谢。
正如我所写,你需要一个简单的状态机(在括号内和括号外)......然后对于每个字符,你分析它并且如果必要的话改变状态机的状态,并决定是否需要输出它。
public static string RemoveCommas(string str)
{
int bracketLevel = 0;
var sb = new StringBuilder(str.Length);
foreach (char ch in str)
{
switch (ch) {
case '[':
bracketLevel++;
sb.Append(ch);
break;
case ']':
if (bracketLevel > 0) {
bracketLevel--;
}
sb.Append(ch);
break;
case ',':
if (bracketLevel == 0) {
sb.Append(ch);
}
break;
default:
sb.Append(ch);
break;
}
}
return sb.ToString();
}
使用方法如下:
string result = "a,b,c,[c,d,e],f,g,[h,i,j]";
Console.WriteLine(RemoveCommas(result));
int
,以便它与递归括号一起工作,例如a,b,[c,d,[e,f]g,h]i,j
。string result2 = result.Aggregate(new
{
BracketLevel = 0,
Result = string.Empty,
}, (state, ch) => new {
BracketLevel = ch == '[' ?
state.BracketLevel + 1 :
ch == ']' && state.BracketLevel > 0 ?
state.BracketLevel - 1 :
state.BracketLevel,
Result = ch != ',' || state.BracketLevel == 0 ? state.Result + ch : state.Result
}).Result;
BracketLevel
)和正在构建的字符串(Result
)一起传递。请不要使用它,它只是作为一个有趣的LINQ片段编写的。正则表达式方法
string stringValue = "a,b,c,[c,d,e],f,g,[h,i,j]";
var result = Regex.Replace(stringValue, @",(?![^\]]*(?:\[|$))", string.Empty);
@",(?![^>]*(?:<|$))"
。 - Smörgåsbordvar output = new string(result
.Where((s, index) => s != ',' ||
IsOutside(result.Substring(0, index)))
.ToArray()
);
//output: a,b,c,[cde],f,g,[hij]
然而
private static bool IsOutside(string value)
{
return value.Count(i => i == '[') <= value.Count(i => i == ']');
}