使用LINQ分隔列表元素并将结果插回列表

时间:2014-06-25 06:27:21

标签: c# asp.net linq list word

我有一个像这样的字符串列表(“”Joe “,”想要“,”“,”谢谢“,”你!“”)我想要的是分开“你”,“!”和““并使用LINQ将它们插回到该列表中。我知道这里有很多LINQ专家,可以在一分钟内完成。我正在做的是将一个句子分成单词:

    string sentence = "\"Joe wants to thank you!\"";
    string[] words = sentence.split(" ");
    List<string> result = new List<string>();

    for (int i = 0; i < words.Length; i++)
    {
        string word = words[i];
        if (word.EndsWith("."))
        {
            result.Add(word.Substring(0, word.LastIndexOf(".")));
            result.Add(".");
        }
        else if (word.EndsWith("..."))
        {
            result.Add(word.Substring(0, word.LastIndexOf("...")));
            result.Add("...");
        }
        else if (word.EndsWith(","))
        {
            result.Add(word.Substring(0, word.LastIndexOf(",")));
            result.Add(",");
        }
        else if (word.EndsWith("\""))
        {
            result.Add(word.Substring(0, word.LastIndexOf("\"")));
            result.Add("\"");
        }


     }

问题在于句子以结尾!“注意:单词是按空格分割的数组。

5 个答案:

答案 0 :(得分:2)

也许你只是在寻找正则表达式?

var sentence = "\"Joe wants to thank you!\"";
var result = Regex.Split(sentence, @"(\.{3}|\W)").Where(w => !String.IsNullOrWhiteSpace(w));

结果现在是:

enter image description here

答案 1 :(得分:1)

如果输入数组是普通字符串,那么使用\b的正则表达式将其拆分要简单得多,这意味着"word boundary"

var splitted = Regex.Split(input_string, @"(\.\.\.)|(\W)")
        .Where(chunk => !string.IsNullOrWhiteSpace(chunk))
        .Select(chunk => chunk.Trim());

同样适用于空格和标点符号,但会将数字视为单词的一部分(例如Joe2在分割后仍会保留Joe2

此外,由于\b是零长度匹配,因此speace被视为&#34;单词&#34;,因此为了删除它们Where被使用。

有关详细信息,请参阅Regex.SplitWhere

编辑:修复线程中其他人指出的缺陷后,这个答案基本上与他们的答案相同。看起来对于这个问题,所有正确的答案都是一样的,但每个错误的答案都是唯一错误的:)

答案 2 :(得分:1)

这是一个专注于使用Regex.Split而不是使用Linq的解决方案(尽管Linq仍然使用):

string sentence = "\"Joe wants to thank you! comma, ellipsis...exclamation! period.\""; 
string pattern = @"(\.\.\.)|([ ""\.,\\!])";
IEnumerable<string> words = Regex.Split(sentence, pattern)
                                 .Where (x => !String.IsNullOrWhiteSpace(x));
foreach (var word in words) { Console.WriteLine(word); }

正则表达式本身会拆分您想要拆分的任何字符,包括省略号(注意它首先出现在正则表达式中)。正则表达式使用capture来返回输出中的split char,然后Linq用于去除空项和单个空格。

这一项的输出是:

"
Joe
wants
to
thank
you
!
comma
,
ellipsis
...
exclamation
!
period
.
"

答案 3 :(得分:1)

因为您已经按空格拆分,只需replace并在拆分前添加空格

sentence = sentence.Replace("!", " !");

我认为你不需要linq,但对你来说有点优雅

var addMyspace = new List<string>{"!", "...", "\"", ".", ","};

foreach(var s in addMyspace)
{
     sentence = sentence.Replace(s, string.Format(" {0}",s));
}
//split

答案 4 :(得分:0)

这是一个解决方案,适用于您在字符串中可能遇到的任何标点符号。

Regex regex = new Regex(@"(\w+|(\W)\2*)");

string sentence = "\"Joe wants to thank you! Here is another sentence, where we will...get this to work! Right now.\"";

var words = regex.Matches(sentence).Cast<Match>().Where(m => !String.IsNullOrWhiteSpace(m.Value)).Select(m => m.Value);

foreach (var word in words)
    Console.WriteLine(word);

<强>输出

"
Joe
wants
to
thank
you
!
Here
is
another
sentence
,
where
we
will
...
get
this
to
work
!
Right
now
.
"