2012-06-08 29 views
7

No soy un experto en expresiones regulares y hoy en mi proyecto me enfrento a la necesidad de dividir cadenas largas en varias líneas para verificar si el texto de cadena se ajusta a la altura de la página.Expresión regular para dividir cadenas largas en varias líneas

Necesito una expresión regular C# para dividir cadenas largas en varias líneas por "\n", "\r\n" y mantener 150 caracteres por línea máxima. Si el carácter 150 está en el medio de una palabra, la palabra completa debe moverse a la siguiente línea.

¿Alguien me puede ayudar?

+1

expresión ¿Por qué regular? Si muestra la etiqueta C#, hágalo a través de las funciones de C#. –

+0

¿Desea insertar saltos de línea para cada línea cada 150 caracteres? Ejemplo de entrada y salida (con un límite más corto) podría ayudar a visualizar lo que desea hacer. – Qtax

+0

Bummer. La regla del salto de palabra es dolor: ¿cómo defines una palabra (mucho más complicada de lo que probablemente crees)? – Crisfole

Respuesta

0

Aquí van:

^.{1,150}\n 

Esto coincidirá con la cadena inicial más larga de esta manera.

0

si lo que desea es dividir una cadena larga en las líneas de 150 caracteres entonces no estoy seguro de por qué se necesitaría una expresión regular:

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

editado para dar cuenta de separación de palabras

+0

El problema es que le importan los saltos de palabra. –

+0

sí, mi mal ... – paul

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

No captura correctamente los límites de las palabras. – MoonKnight

0

Este código debería ayudarlo. Verificará la longitud de la cadena actual. Si es mayor que su maxLength (150) en este caso, comenzará en el carácter 150 y (ir hacia atrás) encontrará el primer carácter no de palabra (según lo describe el OP, esta es una secuencia de caracteres que no son de espacio)). Luego almacenará la cadena hasta ese carácter y comenzará de nuevo con la cadena restante, repitiendo hasta que terminemos con una subcadena que tenga menos de maxLength caracteres. Finalmente, únete a todos nuevamente en una cadena final.

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

Nota: Si ejecuta este código en una aplicación de consola, es posible que desee cambiar "maxLength" a un número más reducido de manera que la consola no se ajusta a usted.

Nota: Este código no tiene en cuenta ningún carácter de tabulación. Si también se incluyen pestañas, su situación se vuelve un poco más complicada.

Actualización: Corregí un error donde las nuevas líneas comenzaban con un espacio.

+0

El enfoque de la solución descrita por Andras Zoltan es el que está más cerca de lo que necesito. Lo único que necesito ahora es garantizar que si el char 150 está en el medio de una palabra, toda la palabra completa (para este caso considero palabra una secuencia de caracteres sin espacios) se mueve a la siguiente línea. – user1444433

Cuestiones relacionadas