C#是否具有像Java一样的String Tokenizer?

C#是否具有像Java一样的String Tokenizer?

Does C# have a String Tokenizer like Java's?

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


您可以使用String.Split方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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#中分割字符串的文章(Performance,Regex)


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

尽管Java中的StringTokenizer仅允许使用一个定界符,但实际上我们可以拆分多个定界符,从而使正则表达式的必要性降低(尽管如果需要正则表达式,则一定要使用正则表达式!)例如:

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

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

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

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


您需要使用字符串的split方法。实际上,不赞成使用Java中的tokenizer类,而推荐使用Java的字符串拆分方法。


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

1
string.Split()

与Java的方法类似:

1
Regex.Split(string, pattern);

哪里

  • string-您需要拆分的文本
  • pattern-字符串类型模式,正在分割文本的内容

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

要么

1
2
3
4
_words = new List<string>(YourText.Trim('\
'
, '\
'
).Split(' ').
            Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray())));

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


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


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


如果您尝试在.NET Console应用程序中执行诸如拆分命令行参数之类的操作,则会遇到问题,因为.NET已损坏或试图变得更聪明(这意味着它同样出色)。我需要能够通过空格字符来分隔参数,并保留引用的所有文字,以便它们不会在中间被分隔。这是我为完成这项工作而编写的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
}

如果使用的是C#3.5,则可以将扩展方法写入System.String,该方法可以进行所需的拆分。然后,您可以使用语法:

1
string.SplitByMyTokens();

更多信息和来自MS的有用示例,请参见http://msdn.microsoft.com/zh-cn/library/bb383977.aspx


推荐阅读