2008-09-16 16 views
61

Estoy haciendo un análisis simple de entrada de cadena y estoy necesitando un tokenizador de cadena. 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?¿Tiene C# un Tokenizer de cadenas como el de Java?

+1

misma pregunta: http://stackoverflow.com/questions/1134311/c-tokenizer-keeping-the-seperators – Mikhail

Respuesta

110

Puede usar String.Split method.

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 Sam Allen's article about splitting strings in c# (Rendimiento, Regex)

3

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

 
string.Split() 
18

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

+1

AFA, es de hecho obsoleto, pero no a favor del método 'String # split'. Más o menos a favor de la clase 'Scanner'. – bvdb

1

para la división compleja que podría utilizar una expresión regular la creación de una colección partido.

-2

Si está utilizando C# 3.5 puede escribir un método de extensión para System.String que hace la división que necesita. A continuación, 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

+10

Esta es una solución a un problema local, no una operación obvia/de propósito general System.String. Una clase de utilidad podría estar en orden, pero sería un método de extensión abusivo usar aquí un método de extensión. –

17

Solo quiero resaltar el poder del método Split de C# y brindar una comparación más detallada, particularmente de alguien que proviene de un backgrou de Java Dakota del Norte.

Mientras StringTokenizer en Java sólo permite un único delimitador, en realidad podemos dividir en múltiples delimitadores hacer expresiones regulares menos necesario (aunque si uno necesita de expresiones regulares, el uso de expresiones regulares por todos los medios!) Tomemos, por ejemplo, esto:

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

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

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

Una cosa tokenizer cadena de Java no tiene que creo que C# es deficiente (al menos Java 7 tiene esta característica) es la capacidad para 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.

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

El método similar al de Java es:

Regex.Split(string, pattern); 

donde

  • string - el texto necesita dividir
  • pattern - cadena de patrón de tipo, lo que se está dividiendo el texto
+0

O String.Split para una tokenización más simple. –

0

Si usted está tratando de hacer algo como argumentos de línea de comando de la división en una aplicación de consola .NET, vas a tener problemas porque es bien .NET roto o está tratando de ser inteligente (lo que significa que es tan bueno como 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 he escrito 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; 
} 
Cuestiones relacionadas