我正在执行简单的字符串输入解析,并且需要一个字符串标记器。 我是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中最接近的是
与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