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


Answers:



22

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

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

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

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

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

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


19

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


2
AFAI,确实已弃用,但不赞成该String#split方法。或多或少地赞成Scanner阶级。
bvdb


2

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


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

2

与Java的方法类似:

Regex.Split(string, pattern);

哪里

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

或String.Split用于更简单的标记化。
叫我史蒂夫(Steve)



-1

如果您尝试在.NET Console应用程序中执行诸如拆分命令行参数之类的操作,则会遇到问题,因为.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;
}

-2

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

string.SplitByMyTokens();

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


10
这是对局部问题的解决方案,而不是显而易见的/通用的System.String操作。实用程序类可能是按顺序排列的,但是在此处使用扩展方法可能会滥用扩展方法。
山姆·哈威尔2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.