Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使此函数不过早拆分?_C# - Fatal编程技术网

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));
}