C#Regular Expression在第三个字符后插入“_”,然后在第八个字符后面加一个新行插入第七个字符

时间:2014-01-11 17:28:08

标签: c# regex string

我想知道是否有人可以提供帮助。我正在尝试更改以下格式的字符串:

goeirjew98rut34ktljre9t30t4j3der

输出如下:

geo_irje_w

98r_ut34_k

tlj_re9t_3

0t4_j3de_r

因此,在第三个和第七个字符后插入一个下划线,并在第八个字符后插入一个新行。

在做了一些阅读后,我认为最好的方法可能是通过正则表达式,如下面链接中的示例:

http://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110).aspx

但是我不知道如何根据我的需要修改它。任何有用的帮助都会非常感激。

由于

4 个答案:

答案 0 :(得分:2)

这绝对是通过快速循环解决的问题:

string s = "goeirjew98rut34ktljre9t30t4j3der";

var outputs = new List<string>();
for (var i = 0; i < s.Length; i += 8)
{
    string sub = s.Substring(i, Math.Min(8, s.Length - i));
    if(sub.Length > 3)
        sub = sub.Insert(3, "_");

    if (sub.Length > 8)
        sub = sub.Insert(8, "_");

    outputs.Add(sub);
}

答案 1 :(得分:2)

可以通过正则表达式和替换来轻松解决,如下所示:

var s = "goeirjew98rut34ktljre9t30t4j3der";
Regex.Replace(s, @"(\w{3})(\w{4})(\w{1})", "$1_$2_$3\n").Dump();

答案 2 :(得分:0)

我认为您不能通过此规则在字符串中插入char,但我希望此代码对您有用。

public string Decode(string str)
{
    var state = 0;
    var c = 0;
    var newStr = string.Empty;
    foreach (var ch in str)
    {
        c++;
        newStr += ch;
        if (state == 0 && c == 3)
        {
            newStr += "_";
            state = 1;
            c = 0;
        }
        if (state == 1 && c == 4)
        {
            newStr += "_";
            state = 2;
            c = 0;
        }
        if (state == 2 && c == 1)
        {
            newStr += "\r\n";
            state = 0;
            c = 0;
        }
    }
    return newStr;
}

答案 3 :(得分:0)

我会这样做,所以你可以动态改变一切并使用stringextentions

class Program
{
    static void Main(string[] args)
    {
        string str = "goeirjew98rut34ktljre9t30t4j3der";
        var parts = str.SplitInParts(8); //Split in different parts
        foreach (var part in parts)
        {
            string formattedString = part.MultiInsert("_", 2, 6); //Insert your char on all position u want
            Console.WriteLine(formattedString);
        }
        Console.ReadKey();
    }
}

static class StringExtensions
{
    public static IEnumerable<String> SplitInParts(this String s, Int32 partLength)
    {
        if (s == null)
            throw new ArgumentNullException("s");
        if (partLength <= 0)
            throw new ArgumentException("Part length has to be positive.", "partLength");

        for (var i = 0; i < s.Length; i += partLength)
            yield return s.Substring(i, Math.Min(partLength, s.Length - i));
    }

    public static string MultiInsert(this string str, string insertChar, params int[] positions)
    {
        StringBuilder sb = new StringBuilder(str.Length + (positions.Length * insertChar.Length));
        var posLookup = new HashSet<int>(positions);
        for (int i = 0; i < str.Length; i++)
        {
            sb.Append(str[i]);
            if (posLookup.Contains(i))
                sb.Append(insertChar);
        }
        return sb.ToString();
    }
}