English 中文(简体)
C#有像Java那样的字符串标记器吗?
原标题:
  • 时间:2008-09-16 08:38:15
  •  标签:

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

最佳回答

您可以使用String.Splite方法

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只允许使用单个分隔符,但我们实际上可以拆分多个分隔符,从而减少正则表达式的必要性(尽管如果需要regex,请使用regex!)例如:

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

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

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

Java的字符串标记化器有一点我认为C#所缺乏的(至少Java 7有这个功能),那就是能够将分隔符作为标记保留。C#的拆分将丢弃这些令牌。这在某些NLP应用程序中可能很重要,但对于更通用的应用程序来说,这可能不是问题。

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

我认为在.NET框架中最接近的是

string.Split()

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

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

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

与Java的方法类似的是:

Regex.Split(string, pattern);

哪里

  • string - the text you need to split
  • pattern - string type pattern, what is splitting the text

使用Regex.Split(字符串,“#|#”)

read this, split function has an overload takes an array consist of seperators http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx

如果你试图在.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;
}

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

string.SplitByMyTokens();

有关MS的更多信息和有用示例,请点击此处http://msdn.microsoft.com/en-us/library/bb383977.aspx





相关问题