2012-06-08 15 views
7

Non sono un esperto di espressioni regolari e oggi nel mio progetto ho bisogno di dividere la stringa lunga in più righe per verificare se il testo della stringa si adatta all'altezza della pagina.Espressione regolare per dividere stringhe lunghe in più righe

Ho bisogno di un'espressione regolare C# per dividere stringhe lunghe in più righe da "\n", "\r\n" e mantenendo 150 caratteri per riga al massimo. Se il carattere 150 è nel mezzo di una parola, l'intera parola dovrebbe essere spostata sulla riga successiva.

Qualcuno può aiutarmi?

+1

espressione Perché regolare? Se mostri il tag C#, fallo tramite le funzioni C#. –

+0

Quindi vuoi inserire interruzioni di riga per ogni riga ogni 150 caratteri? Esempio di input e output (con un limite più breve) potrebbe aiutare a visualizzare ciò che si vuole fare. – Qtax

+0

Bummer. La regola della parola d'ordine è il dolore: come definisci una parola (molto più complicata di quanto probabilmente pensi)? – Crisfole

risposta

0

Qui si va:

^.{1,150}\n 

questo corrisponderà alla stringa iniziale più lunga come questa.

0

se si desidera solo per dividere una lunga serie in linee di 150 caratteri poi non sono sicuro perché avresti bisogno di un'espressione regolare:

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

modificato per tenere conto di parola rompe

+0

Il problema è che a lui importa delle interruzioni di parole. –

+0

sì, mio ​​male .... – paul

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

Non cattura correttamente i limiti delle parole. – MoonKnight

0

Questo codice dovrebbe essere d'aiuto. Controllerà la lunghezza della stringa corrente. Se è maggiore del tuo maxLength (150) in questo caso, inizierà dal 150 ° carattere e (andando indietro) trova il primo carattere non parola (come descritto dall'OP, questa è una sequenza di caratteri non spaziali). Quindi memorizzerà la stringa fino a quel carattere e ricomincerà da capo con la stringa rimanente, ripetendo fino a quando non si finisce con una sottostringa che è inferiore ai caratteri maxLength. Infine, uniscili tutti di nuovo insieme in una stringa finale.

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: Se si esegue questo codice in un'applicazione di console, è possibile modificare "maxLength" ad un numero più piccolo in modo che la console non va a capo su di voi.

Nota: Questo codice non ha alcun carattere di tabulazione. Se sono incluse anche le schede, la situazione diventa un po 'più complicata.

Aggiornamento: Ho risolto un errore nel caso in cui nuove righe iniziassero con uno spazio.

+0

L'approccio alla soluzione descritto da Andras Zoltan è quello più vicino a quello di cui ho bisogno. L'unica cosa di cui ho bisogno ora è di garantire che se il char 150 è nel mezzo di una parola, tutta la parola (per questo caso considero word una sequenza di caratteri senza spazi) viene spostata alla riga successiva. – user1444433

Problemi correlati