我想创建一个功能,其中C#中的字符串可以分成3个字块,如下所示:
Today is a nice day, and I have been driving a car /*(don't laugh lol - not a part of sentence)*/
所以我想要做的第一件事是从字符串中删除除数字和字母之外的所有特殊字符。
一旦我这样做,然后将单词分成3个单词块,其中上句的输出将是:
Today is a
nice day and
I have been
driving a car
我想通过正则表达式做到这一点,但是再次使用LINQ方法和所有可以轻松解决这个问题的方法,所以我不确定选择哪种方式来制作这个?什么是最有效的方式?
P.S。另外一个我想到的问题是,如果一个单词有8个单词,我想把它变成3个单词......那么我怎么会抛出最后两个不符合形成3块"句子"的标准的单词?
有人能帮助我吗?
答案 0 :(得分:0)
string str = "Today is a nice day, and I have been driving a car";
str = Regex.Replace(str, "[^0-9a-zA-Z ]+", "");
string[] arr = str.Split(' ');
int nElements = 0;
for (int i = 0; i < arr.Length; i+=3)
{
if(i+3 < arr.Length)
{
nElements = 3;
}
else
{
nElements = arr.Length - i;
}
Console.WriteLine(arr.Skip(i).Take(nElements).Aggregate((current, next) => current + " " + next));
}
答案 1 :(得分:0)
使用正则表达式([a-zA-Z] +)获取所有单词,然后将其放入数组,并从该构建3个单词块到数组或列表中。 如果你有8个单词,你可以检查数组是否可以除以3,如果不是只删除最后两个或一个单词。代码如下所示:
string str = "Today is a nice day, and I have been driving a car";
Regex r = new Regex("[a-zA-Z]+", RegexOptions.IgnoreCase);
var wordCollection = r.Matches(str).Cast<Match>().Select(m => m.Value).ToList();
var number = wordCollection.Count % 3;
if (number == 1)
{
wordCollection.RemoveAt(wordCollection.Count - 1);
}
else if (number == 2)
{
wordCollection.RemoveAt(wordCollection.Count - 1);
wordCollection.RemoveAt(wordCollection.Count - number - 1);
}
var list = new List<string>();
for (var i = 0; i < wordCollection.Count; i+=3)
{
list.Add(string.Format("{0} {1} {2}", wordCollection[i], wordCollection[i + 1], wordCollection[i + 2]));
}
修改强> 添加howManyToRemove变量以检查是否需要删除一个或两个单词。
编辑2: 我的代码中有一个小错误,我解决了。
答案 2 :(得分:0)
我认为这是实现这一目标的原始方式之一:
您应该将输入字符串拆分为“”,这是通过使用string.Split()
函数完成的,如果没有参数传递,则使用空格分割。
现在你应该只传递你从split中获得的数组,并使用3个元素
要从元素中删除特殊符号,您可以使用以下RegEx
模式[^a-zA-Z0-9]
,其中^ - 表示查找[]
中未指定的任何元素。
string a = "Today is a nice day, and I have been driving";
var res = a.Split();
List<string> groups = new List<string>();
Regex rgx = new Regex("[^a-zA-Z0-9]");
for (int i=0;i< res.Length;i+=3)
{
string result = string.Empty;
try
{
result += rgx.Replace(res[i], "");
}
catch(Exception)
{
}
try
{
result +=" "+ rgx.Replace(res[i+1], ""); ;
}
catch (Exception)
{
groups.Add(result);
break;
}
try
{
result +=" "+ rgx.Replace(res[i + 2], "");
}
catch (Exception)
{
groups.Add(result);
break;
}
groups.Add(result);
}
foreach(var a1 in groups)
{
Console.WriteLine(a1);
}