2009-09-16 16 views

Respuesta

51

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); 
+0

No había oído hablar de Regex.Split() ... ¡gracias! –

+0

No hay problema. Y sí, es una de esas pequeñas gemas escondidas en el marco. – Noldorin

+0

Visual Basic hace esto tan fácilmente (con 'Strings.Split') ... ¿Realmente me arrepentiré de cambiar a C#? – beppe9000

5

En el algoritmo, puede utilizar el método String.IndexOf y pase OrdinalIgnoreCase como parámetro StringComparison.

+1

Entonces no hay forma de aprovechar String.Split? – jdelator

4

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

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") 
2

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); 
+0

Sí, esto es lo que quise decir con permutaciones: se vuelve bastante engorroso para cadenas divididas más largas. – Noldorin

1
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); 
} 
Cuestiones relacionadas