Pergunta

Estou fazendo uma análise simples de entrada de string e preciso de um tokenizer de string.Sou novo em C#, mas programei Java e parece natural que C# tenha um tokenizer de string.Não é?Cadê?Como eu uso isso?

Foi útil?

Solução

Você poderia 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 mais informações, veja Artigo de Sam Allen sobre divisão de strings em c# (Desempenho, Regex)

Outras dicas

Eu só quero destacar o poder do método Split do C# e fornecer uma comparação mais detalhada, especialmente de alguém que tem experiência em Java.

Enquanto StringTokenizer em Java permite apenas um único delimitador, na verdade podemos dividir em vários delimitadores, tornando as expressões regulares menos necessárias (embora se precisar de regex, use regex por todos os meios!) Tomemos por exemplo isto:

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

Isso se divide em três delimitadores diferentes, retornando uma matriz de tokens.Também podemos remover arrays vazios com o que seria um segundo parâmetro para o exemplo acima:

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

Uma coisa que o tokenizer String do Java tem e que acredito que falta em C # (pelo menos o Java 7 tem esse recurso) é a capacidade de manter o (s) delimitador (es) como tokens.O Split do C# descartará os tokens.Isso pode ser importante, digamos, em alguns aplicativos de PNL, mas para aplicativos de uso mais geral, isso pode não ser um problema.

O método split de uma string é o que você precisa.Na verdade, a classe tokenizer em Java está obsoleta em favor do método de divisão de string do Java.

Acho que o mais próximo no .NET Framework é

string.Split()

Para divisão complexa, você pode usar uma regex criando uma coleção de correspondências.

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

Ou

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

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

leia isto, a função split tem uma sobrecarga e leva um array composto por separadoreshttp://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx

O método semelhante ao Java é:

Regex.Split(string, pattern);

onde

  • string - o texto que você precisa dividir
  • pattern - padrão de tipo string, o que está dividindo o texto

Se você estiver tentando fazer algo como dividir argumentos de linha de comando em um aplicativo .NET Console, terá problemas porque o .NET está quebrado ou está tentando ser inteligente (o que significa que está praticamente quebrado).Eu precisava ser capaz de dividir os argumentos pelo caractere de espaço, preservando todos os literais citados para que não fossem divididos no meio.Este é o código que escrevi para fazer o trabalho:

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

Se você estiver usando C# 3.5, poderá escrever um método de extensão para System.String que faça a divisão necessária.Você então pode usar a sintaxe:

string.SplitByMyTokens();

Mais informações e um exemplo útil da MS aqui http://msdn.microsoft.com/en-us/library/bb383977.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top