我正在进行一项任务,我生成一个从文本文件中读取的字符串对象数组。我不能使用正则表达式\ W运算符,因为如果一个单词包含撇号(')或连字符( - )作为单词的一部分,则必须包含它。 \ W分裂这些令牌。但是,我需要它来拆分其他所有不是字母的东西,包括数字。所以我的字符串应该包括a-z,A-Z, - ,'格式。
我的代码如下所示,它给了我几乎正确的输出,但我在数组中有空单元格,它正在读取行的末尾(或新行)。我不知道如何排除那些(\ n \ r),同时保持我的分裂。建议?
try
{
using (StreamReader reader = new StreamReader("file.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
string[] words = SplitWords(line.ToLower());
foreach (string aString in words)
{
Console.WriteLine(aString);
}
}
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
static string[] SplitWords(string lines)
{
return Regex.Split(lines, @"[^-'a-zA-Z]");
}
答案 0 :(得分:1)
你可以用一点Linq做到这一点。用它来排除任何空字符串:
static string[] SplitWords(string lines)
{
return Regex.Split(lines, @"[^-'a-zA-Z]")
.Where(s => s.Length > 0)
.ToArray();
}
或者这可以排除任何仅包含空格的字符串:
static string[] SplitWords(string lines)
{
return Regex.Split(lines, @"[^-'a-zA-Z]")
.Where(s => !s.All(Char.IsWhiteSpace))
.ToArray();
}
答案 1 :(得分:1)
试试这个
return Regex.Split(lines, @"[^-'a-zA-Z]")
.Where(x=>!string.IsNullOrWhiteSpace(x)).ToArray();
使用IsNullOrWhiteSpace和linq仅将匹配元素提取到新数组