我正在做简单的字符串输入解析,并且我需要一个字符串标记器。我是C#的新手,但是已经编程过Java,因此C#应该具有字符串标记器似乎很自然。可以?它在哪里?如何使用?
Answers:
您可以使用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#中分割字符串的文章(Performance,Regex)
我只想强调C#的Split方法的功能并提供更详细的比较,尤其是来自Java背景的人。
尽管Java中的StringTokenizer仅允许使用一个定界符,但实际上我们可以拆分多个定界符,从而使正则表达式的必要性降低(尽管如果需要正则表达式,则一定要使用正则表达式!)例如:
str.Split(new char[] { ' ', '.', '?' })
这将拆分为三个不同的分隔符,并返回标记数组。对于上面的示例,我们还可以使用第二个参数删除空数组:
str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries)
Java的String标记生成器确实具有我相信C#缺少的一件事(至少Java 7具有此功能)是能够将分隔符保留为标记的功能。C#的Split将丢弃令牌。这在某些NLP应用程序中可能很重要,但是对于更通用的应用程序来说,这可能不是问题。
您需要使用字符串的split方法。实际上,不赞成使用Java中的tokenizer类,而推荐使用Java的字符串拆分方法。
String#split
方法。或多或少地赞成Scanner
阶级。
对于复杂的拆分,您可以使用正则表达式创建一个match集合。
与Java的方法类似:
Regex.Split(string, pattern);
哪里
string
-您需要分割的文字pattern
-字符串类型模式,正在分割文本的内容读这篇文章,拆分功能有一个重载需要一个由分隔符组成的数组 http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx
如果您尝试在.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;
}
如果使用的是C#3.5,则可以将扩展方法写入System.String,该方法可以进行所需的拆分。然后,您可以使用语法:
string.SplitByMyTokens();
更多信息和来自MS的有用示例,请参见http://msdn.microsoft.com/zh-cn/library/bb383977.aspx