我有一个像这样的字符串列表(“”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("\"");
}
}
问题在于句子以结尾!“。注意:单词是按空格分割的数组。
答案 0 :(得分:2)
也许你只是在寻找正则表达式?
var sentence = "\"Joe wants to thank you!\"";
var result = Regex.Split(sentence, @"(\.{3}|\W)").Where(w => !String.IsNullOrWhiteSpace(w));
结果现在是:
答案 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.Split
和Where
编辑:修复线程中其他人指出的缺陷后,这个答案基本上与他们的答案相同。看起来对于这个问题,所有正确的答案都是一样的,但每个错误的答案都是唯一错误的:)
答案 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
.
"