【问题标题】:Does C# have a String Tokenizer like Java's?C# 有像 Java 那样的字符串标记器吗?
【发布时间】:2008-09-16 08:38:15
【问题描述】:

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

【问题讨论】:

标签: c# string parsing


【解决方案1】:

你可以使用String.Split method

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's article about splitting strings in c#(性能,正则表达式)

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • AFAI,它确实已被弃用,但不赞成 String#split 方法。或多或少支持Scanner 类。
      【解决方案4】:

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

      字符串.Split()

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:
          _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()))); 
          

          【讨论】:

            【解决方案7】:

            类似Java的方法是:

            Regex.Split(string, pattern);
            

            在哪里

            • string - 需要拆分的文本
            • pattern - 字符串类型模式,什么是分割文本

            【讨论】:

            • 或 String.Split 用于更简单的标记化。
            【解决方案8】:

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

            【讨论】:

            • 为什么?这是做什么的?
            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              如果您尝试在 .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;
              }
              

              【讨论】:

                【解决方案11】:

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

                string.SplitByMyTokens();
                

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

                【讨论】:

                • 这是针对本地问题的解决方案,而不是明显/通用的 System.String 操作。一个实用程序类可能是有序的,但在这里使用扩展方法将是扩展方法的滥用。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-13
                • 2019-05-05
                • 2023-03-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多