我试图将一大串文本分成几个较小的文本字符串,并将每个较小的文本字符串最大长度定义为不同。例如:
"The quick brown fox jumped over the red fence.
The blue dog dug under the fence."
我想要的代码可以将其拆分为更小的行,并且第一行最多包含5个字符,第二行的最大值为11,其余的最大值为20,结果如下: / p>
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.
这一切都在C#或MSSQL中,有可能吗?
答案 0 :(得分:1)
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;
}
这是未经测试/编译的代码,但您应该明白这一点。
我也认为你应该使用StringBuilder,但我不记得如何使用它。
答案 1 :(得分:0)
\A(.{0,5}\b)(.{0,11}\b)(.{0,20}\b)+\Z
将在组1中捕获最多五个字符,在组2中最多捕获11个字符,在组3中捕获最多20个字符。匹配将沿着字分隔符分割,以避免在单词的中间分割。空格,换行符等计为字符并将被保留。
诀窍是获得重复组中的单个匹配,这只能在.NET和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
}
我根本不知道C#,并试图从RegexBuddy的模板和the VB code here构建它,所以请随意指出我的编码错误。
请注意,第二行开头的空格会在上一场比赛结束时被捕获。