2012-06-08 33 views
7

Tôi không phải là chuyên gia về các biểu thức chính quy và hôm nay trong dự án của tôi. Tôi phải chia chuỗi dài thành nhiều dòng để kiểm tra xem văn bản chuỗi có phù hợp với chiều cao của trang hay không.Cụm từ thông dụng để chia các chuỗi dài thành nhiều dòng

Tôi cần biểu thức chính quy C# để chia các chuỗi dài thành nhiều dòng theo "\n", "\r\n" và giữ tối đa 150 ký tự. Nếu ký tự 150 nằm ở giữa một từ, toàn bộ từ sẽ được chuyển sang dòng tiếp theo.

Bất kỳ ai có thể giúp tôi không?

+1

biểu Tại sao thường xuyên? Nếu bạn hiển thị thẻ C#, hãy thực hiện nó qua các hàm C#. –

+0

Vì vậy, bạn muốn chèn dấu ngắt dòng cho mỗi dòng mỗi 150 ký tự? Ví dụ đầu vào và đầu ra (với một giới hạn ngắn hơn) có thể giúp hình dung những gì bạn muốn làm. – Qtax

+0

Rất tiếc. Quy tắc phá vỡ từ là đau: làm thế nào để bạn xác định một từ (phức tạp hơn nhiều so với bạn có thể nghĩ)? – Crisfole

Trả lời

0

Ở đây bạn đi:

^.{1,150}\n 

này sẽ phù hợp với chuỗi ban đầu dài như thế này.

0

nếu bạn chỉ muốn chia một chuỗi dài vào dòng 150 ký tự sau đó tôi không chắc chắn lý do tại sao bạn cần một biểu thức chính quy:

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(); 
    } 

chỉnh sửa để chiếm từ phá vỡ

+0

Vấn đề là anh ta quan tâm đến việc nghỉ giải lao. –

+0

vâng, xấu của tôi .... – paul

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

Không chính xác bắt các ranh giới từ. – MoonKnight

0

Mã này sẽ giúp bạn. Nó sẽ kiểm tra độ dài của chuỗi hiện tại. Nếu nó lớn hơn maxLength (150) trong trường hợp này, nó sẽ bắt đầu ở ký tự thứ 150 và (đi ngược lại) tìm ký tự không phải từ đầu tiên (như được mô tả bởi OP, đây là chuỗi ký tự không dấu cách)). Sau đó, nó sẽ lưu chuỗi lên đến ký tự đó và bắt đầu lại với chuỗi còn lại, lặp lại cho đến khi chúng ta kết thúc bằng chuỗi con nhỏ hơn ký tự maxLength. Cuối cùng, nối tất cả chúng lại với nhau trong một chuỗi cuối cùng.

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); 

Lưu ý: Nếu bạn chạy mã này trong một ứng dụng giao diện điều khiển, bạn có thể muốn thay đổi "maxLength" tới số nhỏ hơn sao cho giao diện điều khiển không quấn vào bạn.

Lưu ý: Mã này không có hiệu lực đối với bất kỳ ký tự tab nào. Nếu các tab cũng được bao gồm, tình huống của bạn sẽ phức tạp hơn một chút.

Cập nhật: Tôi đã khắc phục lỗi khi dòng mới bắt đầu bằng dấu cách.

+0

Cách tiếp cận của giải pháp được mô tả bởi Andras Zoltan là cách tiếp cận gần hơn với những gì tôi cần. Điều duy nhất mà tôi cần bây giờ là đảm bảo rằng nếu char 150 là ở giữa một từ tất cả toàn bộ từ (đối với trường hợp này tôi xem xét từ một chuỗi ký tự không có dấu cách) được chuyển sang dòng tiếp theo. – user1444433

7

Đây thực sự là một vấn đề khá đơn giản. Tìm kiếm bất kỳ ký tự nào lên tới 150, theo sau là dấu cách. Kể từ khi Regex tham lam tự nhiên nó sẽ làm chính xác những gì bạn muốn nó. Thay thế nó bằng các trận đấu cộng với một dòng mới:

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

Replace with

$0\r\n 

Xem thêm: http://regexhero.net/tester/?id=75645133-1de2-4d8d-a29d-90fff8b2bab5

Các vấn đề liên quan