69

我正在做简单的字符串输入解析,我需要一个字符串标记器。我是 C# 新手,但已经编写了 Java,C# 应该有一个字符串标记器似乎很自然。可以?它在哪里?我该如何使用它?

4

11 回答 11

118

您可以使用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
        }
    }
}

有关更多信息,请参阅Sam Allen 关于在 c# 中拆分字符串的文章(性能、正则表达式)

于 2008-09-16T08:43:55.097 回答
24

我只想强调 C# 的 Split 方法的强大功能并提供更详细的比较,尤其是来自 Java 背景的人。

尽管 Java 中的 StringTokenizer 只允许使用单个分隔符,但我们实际上可以拆分多个分隔符,从而减少正则表达式的必要性(尽管如果需要正则表达式,请务必使用正则表达式!)例如:

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

这将在三个不同的分隔符上拆分,返回一个令牌数组。我们还可以使用上面示例的第二个参数删除空数组:

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

Java 的字符串标记器确实具有我认为 C# 缺少的一件事(至少 Java 7 具有此功能)是将分隔符保留为标记的能力。C# 的 Split 将丢弃标记。这在某些 NLP 应用程序中可能很重要,但对于更通用的应用程序,这可能不是问题。

于 2013-09-19T21:21:43.427 回答
19

字符串的 split 方法是您所需要的。事实上,Java 中的 tokenizer 类已被弃用,取而代之的是 Java 的字符串拆分方法。

于 2008-09-16T08:41:40.330 回答
3

我认为 .NET Framework 中最接近的是

字符串.Split()
于 2008-09-16T08:40:05.200 回答
2

对于复杂的拆分,您可以使用正则表达式创建匹配集合。

于 2008-09-16T08:46:57.697 回答
2
_words = new List<string>(YourText.ToLower().Trim('\n', '\r').Split(' ').
            Select(x => new string(x.Where(Char.IsLetter).ToArray()))); 

或者

_words = new List<string>(YourText.Trim('\n', '\r').Split(' ').
            Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray()))); 
于 2015-06-10T23:21:50.327 回答
2

类似Java的方法是:

Regex.Split(string, pattern);

在哪里

  • string- 您需要拆分的文本
  • pattern- 字符串类型模式,什么是分割文本
于 2016-09-02T19:56:52.617 回答
1

采用Regex.Split(string,"#|#");

于 2009-07-30T11:10:22.007 回答
0

读到这里,split 函数有一个重载需要一个由分隔符组成的数组 http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx

于 2009-11-12T08:25:57.687 回答
-1

如果您尝试在 .NET 控制台应用程序中拆分命令行参数之类的操作,您将会遇到问题,因为 .NET 要么已损坏,要么正试图变得聪明(这意味着它与损坏一样好)。我需要能够通过空格字符分割参数,保留任何被引用的文字,这样它们就不会在中间被分割。这是我为完成这项工作而编写的代码:

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;
}
于 2016-12-14T01:43:12.210 回答
-2

如果您使用的是 C# 3.5,您可以为 System.String 编写一个扩展方法来执行您需要的拆分。然后,您可以使用语法:

string.SplitByMyTokens();

更多信息和来自 MS 的有用示例http://msdn.microsoft.com/en-us/library/bb383977.aspx

于 2008-09-16T08:50:17.407 回答