C# 如何使此函数不过早拆分?
我已经写了这个函数C# 如何使此函数不过早拆分?,c#,C#,我已经写了这个函数 internal static IEnumerable<KeyValuePair<char?, string>> SplitUnescaped(this string input, char[] separators) { int index = 0; var state = new Stack<char>(); for (int i = 0; i < input.Length; ++i) {
internal static IEnumerable<KeyValuePair<char?, string>> SplitUnescaped(this string input, char[] separators)
{
int index = 0;
var state = new Stack<char>();
for (int i = 0; i < input.Length; ++i)
{
char c = input[i];
char s = state.Count > 0 ? state.Peek() : default(char);
if (state.Count > 0 && (s == '\\' || (s == '[' && c == ']') || ((s == '"' || s == '\'') && c == s)))
state.Pop();
else if (c == '\\' || c == '[' || c == '"' || c == '\'')
state.Push(c);
if (state.Count == 0 && separators.Contains(c))
{
yield return new KeyValuePair<char?, string>(c, input.Substring(index, i - index));
index = i + 1;
}
}
yield return new KeyValuePair<char?, string>(null, input.Substring(index));
}
因此,考虑到字符串
a > b
我希望它在>上拆分并忽略空格,但是
a b
我确实希望它在空间上分开
如何修复该函数?您可以继续基于and>进行拆分,然后删除空字符串。我认为这样做可以
internal static IEnumerable<KeyValuePair<char?, string>> SplitUnescaped(this string input, char[] separators)
{
int startIndex = 0;
var state = new Stack<char>();
input = input.Trim(separators);
for (int i = 0; i < input.Length; ++i)
{
char c = input[i];
char s = state.Count > 0 ? state.Peek() : default(char);
if (state.Count > 0 && (s == '\\' || (s == '[' && c == ']') || ((s == '"' || s == '\'') && c == s)))
state.Pop();
else if (c == '\\' || c == '[' || c == '"' || c == '\'')
state.Push(c);
else if (state.Count == 0 && separators.Contains(c))
{
int endIndex = i;
while (input[i] == ' ' && separators.Contains(input[i + 1])) { ++i; }
yield return new KeyValuePair<char?, string>(input[i], input.Substring(startIndex, endIndex - startIndex));
while (input[++i] == ' ') { }
startIndex = i;
}
}
yield return new KeyValuePair<char?, string>(null, input.Substring(startIndex));
}
我以前也试图将空格推到堆栈上,然后对此进行一些检查……但我认为这更容易。进行一些布尔运算最后一个字符上有一个拆分,如果设置了,则不拆分。那会把a>b分成a和>b,我想这不是你想要的。但如果不是,是否希望将a>b拆分为a和'b?a>>b`?是的,我想把a>b分成a和b。a> >b在我的语法中不是有效的输入,因此我并不关心在这种情况下会发生什么,除了空格之外,“parts”之间只能有一个拆分字符,问题是它需要返回>作为KeyValuePair的一部分,不是空格。删除出现在其他分隔符之前和之后的空格怎么样?a>b变为a>b,a>b保持为bI考虑到这一点,但问题是,像a>b这样带引号的字符串中的空格很重要,不应该删除或拆分。这里面也有一个bug。。。该功能将在此处保留。。。至少有一段时间。
internal static IEnumerable<KeyValuePair<char?, string>> SplitUnescaped(this string input, char[] separators)
{
int startIndex = 0;
var state = new Stack<char>();
input = input.Trim(separators);
for (int i = 0; i < input.Length; ++i)
{
char c = input[i];
char s = state.Count > 0 ? state.Peek() : default(char);
if (state.Count > 0 && (s == '\\' || (s == '[' && c == ']') || ((s == '"' || s == '\'') && c == s)))
state.Pop();
else if (c == '\\' || c == '[' || c == '"' || c == '\'')
state.Push(c);
else if (state.Count == 0 && separators.Contains(c))
{
int endIndex = i;
while (input[i] == ' ' && separators.Contains(input[i + 1])) { ++i; }
yield return new KeyValuePair<char?, string>(input[i], input.Substring(startIndex, endIndex - startIndex));
while (input[++i] == ' ') { }
startIndex = i;
}
}
yield return new KeyValuePair<char?, string>(null, input.Substring(startIndex));
}