Necesito dividir una cadena digamos "asdf aA asdfget aa uoiu AA" dividir usando "aa" ignorando la caja. a¿Cómo dividir una cadena sin tener en cuenta la caja del delimitador?
"asdf "
"asdfget "
"uoiu "
Necesito dividir una cadena digamos "asdf aA asdfget aa uoiu AA" dividir usando "aa" ignorando la caja. a¿Cómo dividir una cadena sin tener en cuenta la caja del delimitador?
"asdf "
"asdfget "
"uoiu "
No hay manera fácil de lograr esto usando string.Split
. (Bueno, excepto para especificar todas las permutaciones de la cadena dividida para cada char inferior/mayúscula en una matriz - no muy elegante, creo que estarás de acuerdo.)
Sin embargo, Regex.Split
debería hacer el trabajo bastante bien.
Ejemplo:
var parts = Regex.Split(input, "aa", RegexOptions.IgnoreCase);
En el algoritmo, puede utilizar el método String.IndexOf y pase OrdinalIgnoreCase como parámetro StringComparison.
Entonces no hay forma de aprovechar String.Split? – jdelator
Mi respuesta no es tan buena como Noldorin's, pero la dejo para que la gente pueda ver el método alternativo. Esto no es tan bueno para divisiones simples, pero es más flexible si necesita hacer un análisis más complejo.
using System.Text.RegularExpressions;
string data = "asdf aA asdfget aa uoiu AA";
string aaRegex = "(.+?)[aA]{2}";
MatchCollection mc = Regex.Matches(data, aaRegex);
foreach(Match m in mc)
{
Console.WriteLine(m.Value);
}
Si no se preocupan por caso, entonces la cosa más simple que hacer es obligar a la cadena a mayúsculas o minúsculas antes de usar dividida.
stringbits = datastring.ToLower().Split("aa")
Si se preocupan por caso para los bits interesantes de la cadena, pero no los separadores continuación, me gustaría utilizar String.Replace para forzar a todos los separadores a un caso específico (superior o inferior, no importa) y luego llame a String.Split usando el caso correspondiente para el separador.
strinbits = datastring.Replace("aA", "aa").Replace("AA", "aa").Split("aa")
No es la versión pretties sino que también funciona:
"asdf aA asdfget aa uoiu AA".Split(new[] { "aa", "AA", "aA", "Aa" }, StringSplitOptions.RemoveEmptyEntries);
Sí, esto es lo que quise decir con permutaciones: se vuelve bastante engorroso para cadenas divididas más largas. – Noldorin
public static List<string> _Split(this string input,string[] splt)
{
List<string> _Result=new List<string>();
foreach(string _splt in splt)
{
if (splt.Count() == 1)
{
_Result.AddRange(Regex.Split(input, _splt, RegexOptions.IgnoreCase).ToList());
}
else
{
List<string> NewStr = Regex.Split(input, _splt, RegexOptions.IgnoreCase).ToList();
foreach(string _NewStr in NewStr)
{
List<string> NewSplt = splt.ToList();
NewSplt.Remove(_splt);
return _Split(_NewStr, NewSplt.ToArray());
}
}
}
return _Result;
}
a continuación, utilizar esta función como bramido
public frmThematicConversation()
{
InitializeComponent();
string str = "a b c d e f g h a b c f a d c b f";
string[] splt = { "a", "b" };
List<string> _result = str._Split(splt);
}
Plus1 para no usar palabras reales pero aún manteniendo la continuidad de la pregunta – user1