curieux de savoir si cela peut être simplifié ...Comment simplifier cette méthode (en séparant les guillemets sans guillemets, sans crochets, sans échappement)?
internal static IEnumerable<string> Split(string str, char sep = ',')
{
int lastIndex = 0;
bool quoted = false;
bool escaped = false;
bool bracketed = false;
char lastQuote = '\0';
for (int i = 0; i < str.Length; ++i)
{
if (str[i] == '[')
{
if (!quoted && !escaped)
bracketed = true;
escaped = false;
}
else if (str[i] == ']')
{
if (!quoted && !escaped)
bracketed = false;
escaped = false;
}
else if (str[i] == '\\')
{
escaped = !escaped;
}
else if (str[i] == '"' || str[i] == '\'')
{
if (!escaped)
{
if (quoted)
{
if (lastQuote == str[i])
quoted = false;
}
else
{
quoted = true;
lastQuote = str[i];
}
}
escaped = false;
}
else if (str[i] == sep)
{
if (!quoted && !escaped && !bracketed)
{
yield return str.Substring(lastIndex, i - lastIndex);
lastIndex = i + 1;
}
escaped = false;
}
else
{
escaped = false;
}
}
yield return str.Substring(lastIndex);
}
A écrit cette méthode pour diviser sur des virgules qui ne sont pas à l'intérieur []
, ne sont pas traités et ne sont pas échappés. Est-ce que c'est un problème intrinsèquement difficile, ou est-ce que j'ai pris une approche stupide?
Entrée:
foreach(var sel in SharpQuery.SplitCommas("\"comma, in quotes\", comma[in,brackets], comma[in \"quotes, and brackets\"], \"woah, 'nelly,' \\\"now you,re [talking, crazy\\\"\"")) {
Console.WriteLine(sel);
}
Sortie prévue:
"comma, in quotes"
comma[in,brackets]
comma[in "quotes, and brackets"]
"woah, 'nelly,' \"now you,re [talking, crazy\""
Avez-vous pensé à regex ?? – jimplode
Le code que vous avez produit peut-être pas le plus concis ou élégant est * maintenable * - ce qui (à mon avis) est l'une des choses les plus importantes pour le code à être. Ce code cause-t-il des problèmes? Sinon, je le laisserais seul. – ChrisF
@jimplode: Oui, et je crois que ce serait une approche terrible, si c'est faisable. @ChrisF: Semble fonctionner dans les tests que j'ai courus. Je ne suis pas trop inquiet à propos de l'optimisation, je me demandais simplement si elle pourrait être simplifiée davantage ... elle souffre d'un peu de redondance de code et d'autres choses. – mpen