如果长度超过'n'字符,我需要用新行拆分字符串。在每个'n'字符之后应该有一个新的行。
我已经编写了适用于这种情况的代码:
string text = "11+222+333+44444+555555+6666666";
var regex = new Regex(@".{"+n+"}");
text = regex.Replace(text, "$&" + "\r\n"); //result
然而还有一个要求。假设字符串总是具有digit
和plus
的格式(在开始和结束时没有'+'),字符串仍然应该在'n'字符后用新行分割,但它不能分割数字。即输出不能像这样(n = 15):
11+222+333+444
4+555555+66666
6
相反,它应该分开,以便数字保持不分开,行长度不超过n:
11+222+333
4444+555555
+666666
此外,如果该行被拆分,它不应该在开始时包含'+'
neigher,也不应包含结尾。最终输出:
11+222+333
4444+555555
666666
谢谢!
答案 0 :(得分:3)
string text = "11+222+333+44444+555555+6666666";
var regex = new Regex(@"(.{1," + n + @"})(\+|$)");
text = regex.Replace(text, "$1" + "\r\n"); //result
您尝试匹配1 ... n个字符(,{1,n}
)。你把它放在第一个捕获组中。然后你有另一个捕获组,可以是+
或字符串的结尾($
)。替换时,保留第一个捕获组的文本(带有数字的文本)($1
),但删除第二个捕获组(请注意,不能真正删除字符串的结尾)
请注意,有一个有趣的副作用,这很好。如果你有(例如)n = 3,你就会得到
11+222
333
44444
555555
6666666
没关系...将数字保持在一起是最好的选择。会发生什么事情是正则表达式没有“锚定”到左边的任何东西,所以当它最终看到4444+555555
时它匹配4 444 + ,并且仅替换该部分。< / p>
答案 1 :(得分:1)
正则表达式听起来有点过分,非专业的Regex用户很难维护。我会推荐一些代码如下(这是空调代码;换句话说,我只是在这里输入代码):
// container of final strings
List<string> strings = new List<string>();
// original string
string original = "11+222+333+44444+555555+6666666";
// max length of new string
int n = 12;
// split to number parts
string[] numbers = original.Split("+");
// current output string
string current = ""
foreach (string number in numbers)
{
if ((number.Length + current.Length) >= n)
{
// can't add this one to current so store current and start new one
strings.Add(current);
current = number;
}
else
{
if (!string.IsNullOrEmpty(current)
{
current = current + "+" + number;
}
else
{
current = number;
}
}
}
// at end, add the final current if not empty
if (!string.IsNullOrEmpty(current))
{
strings.Add(current);
}