Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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#_String_String Parsing - Fatal编程技术网

拆分平衡字符串的更有效方法C#

拆分平衡字符串的更有效方法C#,c#,string,string-parsing,C#,String,String Parsing,我以前用过平衡正则表达式,当时我只有一个平衡字符……但随着平衡字符的增多,它变得更加复杂和丑陋 就我目前的目的而言,我编写了一个方法,通过标记字符串来实现这一点,但它非常慢(而且效率非常低)。最昂贵的部分似乎是我正在做的毫无意义的子字符串使用(是的,我知道这很糟糕) 基本上,我想采取以下措施 hello("(abc d)", efg (hijk)) and,some more<%lmn, "o(\")pq", (xy(z))%> …我有“平衡分组字符串” 我不想为此编写一个完整

我以前用过平衡正则表达式,当时我只有一个平衡字符……但随着平衡字符的增多,它变得更加复杂和丑陋

就我目前的目的而言,我编写了一个方法,通过标记字符串来实现这一点,但它非常慢(而且效率非常低)。最昂贵的部分似乎是我正在做的毫无意义的子字符串使用(是的,我知道这很糟糕)

基本上,我想采取以下措施

  hello("(abc d)", efg (hijk)) and,some more<%lmn, "o(\")pq", (xy(z))%>
…我有“平衡分组字符串”

我不想为此编写一个完整的大型解析器

代码如下:

    public static IEnumerable<string> SplitNotEnclosed(this string s, IEnumerable<string> separators, Dictionary<string, string> enclosingValues = null, IEnumerable<char> escapeCharacters = null, bool includeSeparators = false, StringComparison comparisonType = StringComparison.Ordinal)
    {
        var results = new List<string>();

        var enclosureStack = new Stack<KeyValuePair<string, string>>();
        bool atEscapedCharacter = false;

        if (escapeCharacters == null) escapeCharacters = new[] { '\\' };
        if (enclosingValues == null) enclosingValues = new[] { "\"" }.ToDictionary(i => i);

        var orderedEnclosingValues = enclosingValues.OrderByDescending(i => i.Key.Length).ToArray();
        separators = separators.OrderByDescending(v => v.Length).ToArray();

        var currentPart = new StringBuilder();

        while (s.Length > 0)
        {
            int addToIndex = 0;

            var newEnclosingValue = orderedEnclosingValues.FirstOrDefault(v => s.StartsWith(v.Key, comparisonType));

            if (enclosureStack.Count > 0 && !atEscapedCharacter && s.StartsWith(enclosureStack.Peek().Value))
            {
                addToIndex = enclosureStack.Peek().Value.Length;
                enclosureStack.Pop();
            }
            else if (newEnclosingValue.Key != null && !atEscapedCharacter)
            {
                enclosureStack.Push(newEnclosingValue);
                addToIndex = newEnclosingValue.Key.Length;
            }
            else if (escapeCharacters.Contains(s[0]) && enclosureStack.Count > 0)
            {
                atEscapedCharacter = !atEscapedCharacter;
                addToIndex = 1;
            }
            else if (enclosureStack.Count > 0)
            {
                atEscapedCharacter = false;
                addToIndex = 1;
            }

            if (enclosureStack.Count == 0)
            {
                string separator = separators.FirstOrDefault(v => s.StartsWith(v, comparisonType));

                if (separator != null)
                {
                    if (currentPart.Length > 0) results.Add(currentPart.ToString());
                    results.Add(separator);
                    s = s.Substring(separator.Length);
                    currentPart = new StringBuilder();

                    addToIndex = 0;
                }
                else
                {
                    addToIndex = 1;
                }
            }

            currentPart.Append(s.Substring(0, addToIndex));
            s = s.Substring(addToIndex);
        }

        if (currentPart.Length > 0) results.Add(currentPart.ToString());

        if (!includeSeparators)
        {
            results = results.Except(separators).ToList();
        }

        return results.ToArray();
    }
public static IEnumerable splitnoteClosed(此字符串s,IEnumerable分隔符,字典封闭值=null,IEnumerable escapeCharacters=null,bool includeSeparators=false,StringComparison comparisonType=StringComparison.Ordinal)
{
var results=新列表();
var enclosureStack=新堆栈();
bool-atEscapedCharacter=false;
如果(escapeCharacters==null)escapeCharacters=new[]{'\\'};
if(enclosingValues==null)enclosingValues=new[]{“\”}.ToDictionary(i=>i);
var orderedEnclosingValues=enclosingValues.OrderByDescending(i=>i.Key.Length).ToArray();
separators=separators.OrderByDescending(v=>v.Length.ToArray();
var currentPart=新的StringBuilder();
而(s.Length>0)
{
int addToIndex=0;
var newenclosuringvalue=orderedEnclosingValues.FirstOrDefault(v=>s.StartsWith(v.Key,comparisonType));
if(enclosureStack.Count>0&&!atEscapedCharacter&&s.StartsWith(enclosureStack.Peek().Value))
{
addToIndex=enclosureStack.Peek().Value.Length;
enclosureStack.Pop();
}
else if(newenclosuringvalue.Key!=null&!atEscapedCharacter)
{
enclosureStack.Push(newEnclosuringValue);
addToIndex=newEnclosingValue.Key.Length;
}
else if(escapeCharacters.Contains(s[0])&&enclosureStack.Count>0)
{
atEscapedCharacter=!atEscapedCharacter;
addToIndex=1;
}
else if(enclosureStack.Count>0)
{
atEscapedCharacter=false;
addToIndex=1;
}
if(enclosureStack.Count==0)
{
字符串分隔符=分隔符.FirstOrDefault(v=>s.StartsWith(v,comparisonType));
if(分隔符!=null)
{
如果(currentPart.Length>0)结果。添加(currentPart.ToString());
结果:添加(分隔符);
s=s子串(分隔符长度);
currentPart=新的StringBuilder();
addToIndex=0;
}
其他的
{
addToIndex=1;
}
}
currentPart.Append(s.Substring(0,addToIndex));
s=s.子字符串(addToIndex);
}
如果(currentPart.Length>0)结果。添加(currentPart.ToString());
如果(!包括分离器)
{
结果=结果。除(分隔符).ToList()外;
}
返回结果。ToArray();
}
[space]
,
" "
( )
<% %> 
\
    public static IEnumerable<string> SplitNotEnclosed(this string s, IEnumerable<string> separators, Dictionary<string, string> enclosingValues = null, IEnumerable<char> escapeCharacters = null, bool includeSeparators = false, StringComparison comparisonType = StringComparison.Ordinal)
    {
        var results = new List<string>();

        var enclosureStack = new Stack<KeyValuePair<string, string>>();
        bool atEscapedCharacter = false;

        if (escapeCharacters == null) escapeCharacters = new[] { '\\' };
        if (enclosingValues == null) enclosingValues = new[] { "\"" }.ToDictionary(i => i);

        var orderedEnclosingValues = enclosingValues.OrderByDescending(i => i.Key.Length).ToArray();
        separators = separators.OrderByDescending(v => v.Length).ToArray();

        var currentPart = new StringBuilder();

        while (s.Length > 0)
        {
            int addToIndex = 0;

            var newEnclosingValue = orderedEnclosingValues.FirstOrDefault(v => s.StartsWith(v.Key, comparisonType));

            if (enclosureStack.Count > 0 && !atEscapedCharacter && s.StartsWith(enclosureStack.Peek().Value))
            {
                addToIndex = enclosureStack.Peek().Value.Length;
                enclosureStack.Pop();
            }
            else if (newEnclosingValue.Key != null && !atEscapedCharacter)
            {
                enclosureStack.Push(newEnclosingValue);
                addToIndex = newEnclosingValue.Key.Length;
            }
            else if (escapeCharacters.Contains(s[0]) && enclosureStack.Count > 0)
            {
                atEscapedCharacter = !atEscapedCharacter;
                addToIndex = 1;
            }
            else if (enclosureStack.Count > 0)
            {
                atEscapedCharacter = false;
                addToIndex = 1;
            }

            if (enclosureStack.Count == 0)
            {
                string separator = separators.FirstOrDefault(v => s.StartsWith(v, comparisonType));

                if (separator != null)
                {
                    if (currentPart.Length > 0) results.Add(currentPart.ToString());
                    results.Add(separator);
                    s = s.Substring(separator.Length);
                    currentPart = new StringBuilder();

                    addToIndex = 0;
                }
                else
                {
                    addToIndex = 1;
                }
            }

            currentPart.Append(s.Substring(0, addToIndex));
            s = s.Substring(addToIndex);
        }

        if (currentPart.Length > 0) results.Add(currentPart.ToString());

        if (!includeSeparators)
        {
            results = results.Except(separators).ToList();
        }

        return results.ToArray();
    }