c# - ultimo - Dividir cadena de texto grande en cadenas de longitud variable sin romper palabras y mantener saltos de lĂnea y espacios
string[] c# ejemplos (2)
/A(.{0,5}/b)(.{0,11}/b)(.{0,20}/b)+/Z
capturará hasta cinco caracteres en el grupo 1, hasta 11 en el grupo 2 y fragmentos de hasta 20 en el grupo 3. Los partidos se dividirán a lo largo de delimitadores de palabras para evitar la división en el medio de una palabra. El espacio en blanco, el salto de línea, etc. cuentan como personajes y se conservarán.
El truco es llegar a las coincidencias individuales en el grupo repetido, algo que solo se puede hacer en .NET y Perl 6:
Match matchResults = null;
Regex paragraphs = new Regex(@"/A(.{0,5}/b)(.{0,11}/b)(.{0,20}/b)+/Z", RegexOptions.Singleline);
matchResults = paragraphs.Match(subjectString);
if (matchResults.Success) {
String line1 = matchResults.Groups[1].Value;
String line2 = matchResults.Groups[2].Value;
Capture line3andup = matchResults.Groups[3].Captures;
// you now need to iterate over line3andup, extracting the lines.
} else {
// Match attempt failed
}
No sé C # en absoluto y he tratado de construir esto desde las plantillas de RegexBuddy y el código VB aquí , así que no dude en señalar mis errores de codificación.
Tenga en cuenta que el espacio en blanco al principio de la línea dos se captura al final de la partida anterior.
Estoy tratando de dividir una gran cadena de texto en varias cadenas de texto más pequeñas y definir cada longitud de cadena de texto más pequeña para que sea diferente. por ejemplo:
"The quick brown fox jumped over the red fence.
The blue dog dug under the fence."
Me gustaría tener un código que pueda dividir esto en líneas más pequeñas y tener la primera línea con un máximo de 5 caracteres, la segunda línea con un máximo de 11 y el resto con un máximo de 20, lo que da como resultado:
Line 1: The
Line 2: quick brown
Line 3: fox jumped over the
Line 4: red fence.
Line 5: The blue dog
Line 6: dug under the fence.
Todo esto en C # o MSSQL, ¿es posible?
public List<String> SplitString(String text, int [] lengths)
{
List<String> output = new List<String>();
List<String> words = Split(text);
int i = 0;
int lineNum = 0;
string s = string.empty;
while(i<words.Length)
{
if(s.Length+words[i].Length <lengths[lineNum])
{
s+=words[i];
i++;
if(lineNum<lengths.Length-1)
lineNum++;
}
else
{
output.Add(s);
s=String.Empty;
}
}
s.Remove(S.length-1,1);// deletes last extra space.
return output;
}
public static List<string> Split(string text)
{
List<string> result = new List<string>();
StringBuilder sb = new StringBuilder();
foreach (var letter in text)
{
if (letter != '' '' && letter != ''/t'' && letter != ''/n'')
{
sb.Append(letter);
}
else
{
if (sb.Length > 0)
{
result.Add(sb.ToString());
}
result.Add(letter.ToString());
sb = new StringBuilder();
}
}
return result;
}
Este es un código no comprobado / compilado, pero debes tener la idea.
También creo que debería usar un StringBuilder, pero no recuerdo cómo usarlo.