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

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

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)

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.

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.

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

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

O

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

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

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

lea esto, la función dividida tiene una sobrecarga, toma una matriz compuesta de separadores http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx

El método similar al de Java es:

 Regex.Split(string, pattern); 

dónde

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

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 Tokenise(string value, char seperator) { List result = new List(); 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; } 

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 syntax:

 string.SplitByMyTokens(); 

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

    Intereting Posts