2012-06-08 3 views
7

Я не являюсь экспертом в регулярных выражениях, а сегодня в моем проекте сталкивается с необходимостью разделить длинную строку на несколько строк, чтобы проверить, соответствует ли текст строки высоте страницы.Регулярное выражение для разделения длинных строк в нескольких строках

Мне нужно регулярное выражение C#, чтобы разделить длинные строки в несколько строк на "\n", "\r\n" и сохранить максимум 150 символов. Если символ 150 находится в середине слова, все слово должно быть перемещено на следующую строку.

Может ли кто-нибудь мне помочь?

+1

Почему регулярное выражение? Если вы покажете тег C#, сделайте это с помощью функций C#. –

+0

Итак, вы хотите вставить строки для каждой строки каждые 150 символов? Пример ввода и вывода (с более коротким лимитом) может помочь визуализировать то, что вы хотите сделать. – Qtax

+0

Bummer. Правило прерывания слова - боль: как вы определяете слово (намного сложнее, чем вы, вероятно, думаете)? – Crisfole

ответ

0

Здесь вы идете:

^.{1,150}\n 

Это будет соответствовать самой длинной начальной строки, как это.

0

, если вы просто хотите разбить длинную строку на строки 150 символов, то я не знаю, почему вам нужно регулярное выражение:

private string stringSplitter(string inString) 
    { 
     int lineLength = 150; 

     StringBuilder sb = new StringBuilder(); 

     while (inString.Length > 0) 
     { 
      var curLength = inString.Length >= lineLength ? lineLength : inString.Length; 

      var lastGap = inString.Substring(0, curLength).LastIndexOfAny(new char[] {' ', '\n'}); 

      if (lastGap == -1) 
      { 
       sb.AppendLine(inString.Substring(0, curLength)); 
       inString = inString.Substring(curLength); 
      } 
      else 
      { 
       sb.AppendLine(inString.Substring(0, lastGap)); 
       inString = inString.Substring(lastGap + 1); 
      } 
     } 

     return sb.ToString(); 
    } 

отредактированного объяснить слово ломает

+0

Проблема в том, что он действительно волнует разрывы слов. –

+0

Да, мой плохой .... – paul

1
var regex = new Regex(@".{0,150}", RegexOptions.Multiline); 
var strings = regex.Replace(sourceString, "$0\r\n"); 
+0

Не правильно ловить границы слов. – MoonKnight

0

Этот код должен помочь вам. Он проверит длину текущей строки. Если в этом случае он больше, чем ваш maxLength (150), он начнется с 150-го символа и (в обратном порядке) найдет первый не-словный символ (как описано OP, это последовательность символов без пробела). Затем он сохранит строку до этого символа и начнет заново с оставшейся строкой, повторяя, пока мы не закончим с подстрокой, которая меньше символов maxLength. Наконец, присоедините их все снова вместе в финальной строке.

string line = "This is a really long run-on sentence that should go for longer than 150 characters and will need to be split into two lines, but only at a word boundary."; 

int maxLength = 150; 
string delimiter = "\r\n"; 

List<string> lines = new List<string>(); 
// As long as we still have more than 'maxLength' characters, keep splitting 
while (line.Length > maxLength) 
{ 
    // Starting at this character and going backwards, if the character 
    // is not part of a word or number, insert a newline here. 
    for (int charIndex = (maxLength); charIndex > 0; charIndex--) 
    { 
     if (char.IsWhiteSpace(line[charIndex])) 
     { 
      // Split the line after this character 
      // and continue on with the remainder 
      lines.Add(line.Substring(0, charIndex+1)); 
      line = line.Substring(charIndex+1); 
      break; 
     } 
    } 
} 
lines.Add(line); 
// Join the list back together with delimiter ("\r\n") between each line 
string final = string.Join(delimiter , lines); 

// Check the results 
Console.WriteLine(final); 

Примечание: Если запустить этот код в консольном приложении, вы можете изменить «MAXLENGTH» в меньшем количестве, так что консоль не завернуть на вас.

Примечание: Этот код не принимает никаких символов табуляции. Если вкладки также включены, ваша ситуация становится немного сложнее.

Обновление: Я исправил ошибку, где новые строки начинались с пробела.

+0

Подход решения, описанный Андрасом Золтаном, является тем, что ближе к тому, что мне нужно. Единственное, что мне нужно сейчас, это гарантировать, что если char 150 находится посреди слова, все слово (для этого случая я считаю слово последовательностью символов без пробелов) перемещается в следующую строку. – user1444433

7

Это на самом деле довольно простая проблема. Ищите любые символы до 150, а затем пробел. Поскольку Regex жадно по своей природе, он будет делать именно то, что вы хотите. Заменить его на матч плюс символ новой строки:

.{0,150}(\s+|$) 

Заменить

$0\r\n 

Смотрите также: http://regexhero.net/tester/?id=75645133-1de2-4d8d-a29d-90fff8b2bab5

Смежные вопросы