这是我想要完成的事情。我有一个物体从后面回来 带有字符串描述的数据库。此描述最多可达1000 字符很长,但我们只想显示一个这样的简短视图。所以我编码了 以下内容,但我在实际删除数量方面遇到了麻烦 正则表达式后面的单词找到单词的总数。有没有人 有没有好的方法来淡化低于Regex.Matches的单词?
谢谢!
if (!string.IsNullOrEmpty(myObject.Description))
{
string original = myObject.Description;
MatchCollection wordColl = Regex.Matches(original, @"[\S]+");
if (wordColl.Count < 70) // 70 words?
{
uxDescriptionDisplay.Text =
string.Format("<p>{0}</p>", myObject.Description);
}
else
{
string shortendText = original.Remove(200); // 200 characters?
uxDescriptionDisplay.Text =
string.Format("<p>{0}</p>", shortendText);
}
}
编辑:
所以这就是我自己的工作:
else
{
int count = 0;
StringBuilder builder = new StringBuilder();
string[] workingText = original.Split(' ');
foreach (string word in workingText)
{
if (count < 70)
{
builder.AppendFormat("{0} ", word);
}
count++;
}
string shortendText = builder.ToString();
}
它不漂亮,但它奏效了。我会称之为一种非常天真的方式。感谢所有的建议!
答案 0 :(得分:5)
我会选择严格的字符数而不是字数,因为你可能碰巧有很多长字。
我可能会做(伪代码)
之类的事情if text.Length > someLimit
find first whitespace after someLimit (or perhaps last whitespace immediately before)
display substring of text
else
display text
可能的代码实现:
string TruncateText(string input, int characterLimit)
{
if (input.Length > characterLimit)
{
// find last whitespace immediately before limit
int whitespacePosition = input.Substring(0, characterLimit).LastIndexOf(" ");
// or find first whitespace after limit (what is spec?)
// int whitespacePosition = input.IndexOf(" ", characterLimit);
if (whitespacePosition > -1)
return input.Substring(0, whitespacePosition);
}
return input;
}
答案 1 :(得分:3)
如果你至少使用C#3.0,一种方法就是LINQ,如下所示。如果您严格按字数统计,而不是字符数,则提供此功能。
if (wordColl.Count > 70)
{
foreach (var subWord in wordColl.Cast<Match>().Select(r => r.Value).Take(70))
{
//Build string here out of subWord
}
}
我使用一个简单的Console.WriteLine和你的Regex以及你的问题正文(超过70个单词,结果证明)进行了测试。
答案 2 :(得分:1)
您可以使用Regex Capture Groups保留匹配并稍后访问。
对于您的应用程序,我建议只需用空格分割字符串并返回数组的前n个元素:
if (!string.IsNullOrEmpty(myObject.Description))
{
string original = myObject.Description;
string[] words = original.Split(' ');
if (words.Length < 70)
{
uxDescriptionDisplay.Text =
string.Format("<p>{0}</p>", original);
}
else
{
string shortDesc = string.Empty;
for(int i = 0; i < 70; i++) shortDesc += words[i] + " ";
uxDescriptionDisplay.Text =
string.Format("<p>{0}</p>", shortDesc.Trim());
}
}
答案 3 :(得分:0)
您要删除200个字符还是要在第200个字符处开始截断?当您调用original.Remove(200)
时,您正在索引第200个字符处的截断开始。这是您使用Remove()删除一定数量的字符的方法:
string shortendText = original.Remove(0,200);
从第一个字符开始,从该字符开始删除200。我认为这不是你想要做的事情,因为你缩短了描述。这只是使用Remove()的正确方法。
为什么不拆分字符串,而不是使用Regex matchcollections?它更容易,更直接。您可以将分隔符设置为空格字符并以此方式分割。不确定这是否完全解决了你的需求,但它可能。我不确定您的数据在说明中的含义。但你这样分开了:
String[] wordArray = original.Split(' ');
从那里你可以用wordArray的Length属性值确定单词计数。
答案 4 :(得分:0)
如果我是你,我会选择字符,因为你的文字中可能有很多单字母或许多长字。
直到字符&lt; =你的限制,然后找到下一个空格,然后将这些字符添加到一个新字符串(可能使用SubString
方法)或取这些字符并添加几个句号,然后创建一个新的字符串我想,后者可能是不忠实的。