使用带有条件的Regex,每个n个字符后分割字符串,C#

时间:2015-04-09 10:59:42

标签: c# regex string split

如果长度超过'n'字符,我需要用新行拆分字符串。在每个'n'字符之后应该有一个新的行。

我已经编写了适用于这种情况的代码:

string text = "11+222+333+44444+555555+6666666";
var regex = new Regex(@".{"+n+"}");
text = regex.Replace(text, "$&" + "\r\n"); //result

然而还有一个要求。假设字符串总是具有digitplus的格式(在开始和结束时没有'+'),字符串仍然应该在'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

谢谢!

2 个答案:

答案 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);
}