Pregunta

Estoy realizando un análisis de entrada de cadenas simple 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?

¿Fue útil?

Solución

Podrías usar 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 más información, ver Artículo de Sam Allen sobre la división de cadenas en C# (Rendimiento, expresión regular)

Otros consejos

Solo quiero resaltar el poder del método Split de C# y ofrecer una comparación más detallada, particularmente de alguien que tiene experiencia en Java.

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

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

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

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

Una cosa que tiene el tokenizador String de Java y que creo que le falta a C# (al menos Java 7 tiene esta característica) es la capacidad de mantener los delimitadores como tokens.La división de C# descartará los tokens.Esto podría ser importante, por ejemplo, en algunas aplicaciones de PNL, pero para aplicaciones de propósito más general esto podría no ser un problema.

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.

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

string.Split()

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

_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()))); 

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

lea esto, la función de división tiene una sobrecarga, toma una matriz que consta de separadoreshttp://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 necesitas dividir
  • pattern - patrón de tipo cadena, qué es lo que divide el texto

Si está intentando hacer algo como dividir argumentos de línea de comando en una aplicación de consola .NET, tendrá 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, preservando los literales citados para que no se dividieran por la mitad.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;
}

Si está utilizando C# 3.5, puede escribir un método de extensión en System.String que realice la división que necesita.Luego puedes usar la sintaxis:

string.SplitByMyTokens();

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top