拆分平衡字符串的更有效方法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();
}