【问题标题】:How to insert new line if length of the string is bigger than x without cut the words?如果字符串的长度大于 x 而不剪切单词,如何插入新行?
【发布时间】:2017-12-24 21:42:02
【问题描述】:

我输入了这样的字符串:

你好,我的名字是 Anna_B,我今年 30 岁

你好,我叫

hello_my_name is-Anna B

基本上,所有输入字符串都不遵循任何书写模式,并且它们的长度是可变的。 如果字符数大于 15 但不剪切任何单词,我想在 C# 语言中添加一个新行。

我已经用StringBuilder x.AppendLinestring s.TakeWhilestring s.SkipWhile 尝试了一些实验,但我遇到了麻烦,因为我找不到任何可以解决我的问题的稳健算法。

任何帮助将不胜感激:)

【问题讨论】:

  • 他们总是遵循这些格式吗?当有一条线连接单词时,您是否关心如何拆分?
  • 输入字符串的单词用空格“_”和/或“-”分隔。唯一的要求是不要切字。例如,单词“Anna”的字符应该在同一行。但是“is-Anna”可以写成两行,字符“-”放在哪一行并不重要。
  • 这样的事情最好用正则表达式来完成,因为它们最适合处理单词边界等
  • 但是...如何? @TheBeardedLlama

标签: c# append stringbuilder


【解决方案1】:

试试这个,

逻辑

    public static IEnumerable<string> Split(string inputText, int maxLength)
    {
        int i = 0;
        while (i + maxLength < inputText.Length)
        {
            var lastIndexofUnderScore = inputText.LastIndexOf('_', i + maxLength);
            var lastIndexofSpace = inputText.LastIndexOf(' ', i + maxLength);
            var index = Math.Min(lastIndexofSpace, lastIndexofUnderScore);
            if (index <= 0) 
            {
                index = maxLength;
            }

            yield return inputText.Substring(i, index - i).Trim();

            i = index + 1;
        }

        yield return inputText.Substring(i).Trim();
    }

调用方法:

var inputText = "hello-my-name is Anna_B and I'm 30_years-old";
var length = 15;

var expectedString = new StringBuilder();
var splittedStrings = Split(inputText, length);

foreach (var splittedString in splittedStrings)
{
    expectedString.AppendLine(splittedString);
}

Console.WriteLine(expectedString);

【讨论】:

  • 这会拆分单词
  • 谢谢你阿伦塞尔瓦库马尔!
  • @AnnaB 更新了代码,现在检查 :-)
  • @ArunSelvaKumar 它在这一行给我一个错误:yield return inputText.Substring(i, index - i); 错误:长度不能小于零。
  • 我试过很多,例如:A3AAA3333-BBB、CCD1-Efgve-BoomV5、Anna B Anna B Anna、ABC_DEF_GHI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2015-06-17
  • 1970-01-01
相关资源
最近更新 更多