c# string parsing

¿Tiene C#un Tokenizer de cadenas como el de Java?



split c# (11)

Creo que el más cercano en .NET Framework es

string.Split()

Estoy haciendo un análisis simple de entrada de cadenas y necesito un tokenizador de cadenas. Soy nuevo en C # pero he programado Java, y parece natural que C # tenga un tokenizador de cadenas. ¿Lo hace? ¿Dónde está? ¿Como lo uso?


El método de división de una cadena es lo que necesitas. De hecho, la clase tokenizer en Java está en desuso en favor del método de división de cadenas de Java.


El método similar al de Java es:

Regex.Split(string, pattern);

dónde

  • string - el texto que necesita para dividir
  • pattern - pattern tipo de cadena, lo que está dividiendo el texto

Para la división compleja, puede usar una expresión regular para crear una colección de coincidencias.


Podría usar el método String.Split .

class ExampleClass { public ExampleClass() { string exampleString = "there is a cat"; // Split string on spaces. This will separate all the words in a string string[] words = exampleString.Split('' ''); foreach (string word in words) { Console.WriteLine(word); // there // is // a // cat } } }

Para obtener más información, consulte el artículo de Sam Allen sobre la división de cadenas en c # (Rendimiento, Regex)


Si está utilizando C # 3.5, podría escribir un método de extensión en System.String que haga la división que necesita. A continuación, puede utilizar la sintaxis:

string.SplitByMyTokens();

Más información y un ejemplo útil de MS aquí http://msdn.microsoft.com/en-us/library/bb383977.aspx


Si intentas hacer algo como dividir los argumentos de línea de comando en una aplicación .NET Console, vas a tener problemas porque .NET está roto o está tratando de ser inteligente (lo que significa que está roto). Necesitaba poder dividir los argumentos por el carácter de espacio, conservando los literales que se citaban para que no se dividieran en el medio. Este es el código que escribí para hacer el trabajo:

private static List<String> Tokenise(string value, char seperator) { List<string> result = new List<string>(); value = value.Replace(" ", " ").Replace(" ", " ").Trim(); StringBuilder sb = new StringBuilder(); bool insideQuote = false; foreach(char c in value.ToCharArray()) { if(c == ''"'') { insideQuote = !insideQuote; } if((c == seperator) && !insideQuote) { if (sb.ToString().Trim().Length > 0) { result.Add(sb.ToString().Trim()); sb.Clear(); } } else { sb.Append(c); } } if (sb.ToString().Trim().Length > 0) { result.Add(sb.ToString().Trim()); } return result; }


Solo quiero resaltar el poder del método Split de C # y ofrecer una comparación más detallada, especialmente de alguien que proviene de un fondo Java.

Mientras que StringTokenizer en Java solo permite un único delimitador, en realidad podemos dividir en múltiples delimitadores haciendo que las expresiones regulares sean menos necesarias (aunque si uno necesita expresiones regulares, use regex por todos los medios). Tome por ejemplo esto:

str.Split(new char[] { '' '', ''.'', ''?'' })

Esto se divide en tres delimitadores diferentes que devuelven una matriz de tokens. También podemos eliminar arreglos vacíos con lo que sería un segundo parámetro para el ejemplo anterior:

str.Split(new char[] { '' '', ''.'', ''?'' }, StringSplitOptions.RemoveEmptyEntries)

Algo que Java''s String tokenizer tiene que creo que C # no tiene (al menos Java 7 tiene esta característica) es la capacidad de mantener los delimitadores como tokens. C # ''s Split descartará los tokens. Esto podría ser importante, por ejemplo, en algunas aplicaciones NLP, pero para aplicaciones más generales, esto podría no ser un problema.



use Regex.Split(string,"#|#");


_words = new List<string>(YourText.ToLower().Trim(''/n'', ''/r'').Split('' ''). Select(x => new string(x.Where(Char.IsLetter).ToArray())));

O

_words = new List<string>(YourText.Trim(''/n'', ''/r'').Split('' ''). Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray())));