如何打破在C#中的长字符串不破的话

问题描述:

我想打破长字符串在C#中不破的话
例子:S AAA BBBBBBB CC DDDDDD V破字第7计:如何打破在C#中的长字符串不破的话

S AAA 
BBBBBBB 
CC 
DDDDDD 
V 

我如何做这个?

+1

string.Split('')? – KMC 2013-03-25 08:50:06

+0

按照什么标准选择'S AAA'作为单词? – 2013-03-25 08:55:06

+0

为什么指定了这么多的c#版本?你需要分别对每一个做出回应? – sasjaq 2013-03-25 09:06:00

如果我正确地理解了你的问题,这个窍门。一个递归实现会更酷,但在C#中尾部递归太糟糕了:)

也可以用yield和IEnumerable<string>来实现。

string[] splitSpecial(string words, int lenght) 
{ 
    // The new result, will be turned into string[] 
    var newSplit = new List<string>(); 
    // Split on normal chars, ie newline, space etc 
    var splitted = words.Split(); 
    // Start out with null 
    string word = null; 

    for (int i = 0; i < splitted.Length; i++) 
    { 
     // If first word, add 
     if (word == null) 
     { 
      word = splitted[i]; 
     } 
     // If too long, add 
     else if (splitted[i].Length + 1 + word.Length > lenght) 
     { 
      newSplit.Add(word); 
      word = splitted[i]; 
     } 
     // Else, concatenate and go again 
     else 
     { 
      word += " " + splitted[i]; 
     } 
    } 
    // Flush what we have left, ie the last word 
    newSplit.Add(word); 

    // Convert into string[] (a requirement?) 
    return newSplit.ToArray(); 
} 

string inputStr = "S AAA BBBBBBB CC DDDDDD V "; 
int maxWordLength = 7; 
char separator = ' '; 

string[] splitted = inputStr.Split(new[]{separator}, StringSplitOptions.RemoveEmptyEntries); 

var joined = new Stack<string>(); 
joined.Push(splitted[0]); 

foreach (var str in splitted.Skip(1)) 
{ 
    var strFromStack = joined.Pop(); 
    var joindedStr = strFromStack + separator + str; 
    if(joindedStr.Length > maxWordLength) 
    { 
     joined.Push(strFromStack); 
     joined.Push(str); 
    } 
    else 
    { 
     joined.Push(joindedStr); 
    } 
} 
var result = joined.Reverse().ToArray(); 

Console.WriteLine ("number of words: {0}", result.Length); 

Console.WriteLine(string.Join(Environment.NewLine, result)); 

打印:

number of words: 5 
S AAA 
BBBBBBB 
CC 
DDDDDD 
V 
+2

这不是OP想要的输出。第一个“单词”应该是“AAA”。 – ChrisF 2013-03-25 08:53:34

+0

@ChrisF @anurag问题有一个'没有打破文字'的陈述。是'AAA'吗? – 2013-03-25 08:54:33

+0

我可能是错的,但根据我的理解,他的问题和预期的输出,他想分割字符串的空格字符,然后如果连续的单词少于7个字符组合,那么他们应该被视为一个单一的标记。因此,“S AAA”令牌。 – mematei 2013-03-25 08:55:22

 string str = "S AAA BBBBBBB CC DDDDDD V"; 
     var words = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
     StringBuilder sb = new StringBuilder(); 
     List<string> result = new List<string>(); 
     for (int i = 0; i < words.Length; ++i) 
     { 
      if (sb.Length == 0) 
      { 
       sb.Append(words[i]); 
      } 
      else if (sb.Length + words[i].Length < 7) 
      { 
       sb.Append(' '); 
       sb.Append(words[i]); 
      } 
      else 
      { 
       result.Add(sb.ToString()); 
       sb.Clear(); 
       sb.Append(words[i]); 
      } 
     } 
     if (sb.Length > 0) 
     { 
      result.Add(sb.ToString()); 
     } 

结果将包含:

S AAA 
BBBBBBB 
CC 
DDDDDD 
V 

谓词可根据如果字之间的分离器应该被包括在7个字符被调整或不。

这是一个利用正则表达式威力的较短解决方案。

string input = "S AAA BBBBBBB CC DDDDDD V"; 

// Match up to 7 characters with optional trailing whitespace, but only on word boundaries 
string pattern = @"\b.{1,7}\s*\b"; 

var matches = Regex.Matches(input, pattern); 

foreach (var match in matches) 
{ 
    Debug.WriteLine(match.ToString()); 
} 

为什么不试试正则表达式?

(?:^|\s)(?:(.{1,7}|\S{7,}))(?=\s|$) 

并使用所有捕获。

C#代码:

var text = "S AAA BBBBBBB CC DDDDDD V"; 
var matches = new Regex(@"(?:^|\s)(?:(.{1,7}|\S{7,}))(?=\s|$)").Matches(text).Cast<Match>().Select(x => x.Groups[1].Value).ToArray(); 
foreach (var match in matches) 
{ 
    Console.WriteLine(match); 
} 

输出:

S AAA 
BBBBBBB 
CC 
DDDDDD 
V 

这怎么行分隔符添加到HTML文本:

SplitLongText(字符串_SourceText,INT _MaxRowLength) {

 if (_SourceText.Length < _MaxRowLength) 
     { 
      return _SourceText; 
     } 
     else 
     { 
      string _RowBreakText=""; 
      int _CurrentPlace = 0; 
      while (_CurrentPlace < _SourceText.Length) 
      { 
       if (_SourceText.Length - _CurrentPlace < _MaxRowLength) 
       { 
        _RowBreakText += _SourceText.Substring(_CurrentPlace); 
        _CurrentPlace = _SourceText.Length; 

       } 
       else 
       { 
        string _PartString = _SourceText.Substring(_CurrentPlace, _MaxRowLength); 
        int _LastSpace = _PartString.LastIndexOf(" "); 
        if (_LastSpace > 0) 
        { 
         _RowBreakText += _PartString.Substring(0, _LastSpace) + "<br/>" + _PartString.Substring(_LastSpace, (_PartString.Length - _LastSpace)); 
        } 
        else 
        { 
         _RowBreakText += _PartString + "<br/>"; 
        } 
        _CurrentPlace += _MaxRowLength; 
       } 

      } 
      return _RowBreakText; 

     }