2014-01-11 2 views
2

Мне было интересно, может ли кто-нибудь помочь. Я пытаюсь изменить строку в следующей форме:C# Регулярное выражение для вставки «_» после третьего, затем седьмого символа с новой строкой после восьмого символа

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

Однако я не уверен, как изменить это для мои потребности. Любая помощь, которую так когда-либо будет оценена.

Благодаря

+0

Я не уверен, что вам нужно регулярное выражение, чтобы сделать это. –

+0

Regex особенно полезен для извлечения данных, это немного не работает. Почему вы не можете просто использовать цикл с несколькими 'if's? –

+1

Вам нужно всего лишь использовать метод String.Substring, String.Insert и цикл. –

ответ

2

Это может быть легко решена с помощью регулярного выражения и заменить, например:

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

Мне действительно нравится это решение лучше, чем мое, при условии, что вам будет удобно читать RegExes. OP, если вы используете это, я оставляю для себя комментарии относительно того, что он делает, для ремонтопригодности и/или обучения, пока вы не будете более комфортно с ними. Я делаю это с более сложными, которые у меня есть. – Matt

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); 
} 
+0

Приветствия tencntraze, которые являются блестящими благодаря вашей помощи. Я только начинаю с программирования и C#, поэтому не уверен в лучшем способе делать что-то еще, но чтение по нему кажется идеальным. Еще раз спасибо за вашу помощь :) – user3185573

0

Я думаю, вы не можете вставить символ в строку этим правилом, но я надеюсь, что этот код будет вам полезен.

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; 
} 
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(); 
    } 
} 
Смежные вопросы