2016-06-02 3 views
2

У меня есть строка, какРасщепление специальная строка для некоторых частей

event FILE[2]::OnProc {;? Msg("Step2") } event FILE[test]::OnProc {;? Msg("Step3.1.1") } 

Я хотел бы разделить на несколько частей. желаемый результат пустошь быть список, как

List 
    [0] 
     2 
     ;? Msg("Step2") 
    [1] 
     test 
     ;? Msg("Step3.1.1") 

Как вы видите строка между [] первой записью въезда-го списка, а строкой между {} является следующей записью.

Могу ли я попросить вашу помощь, как я могу получить желаемый список?

Update:

Я попробовал этот код, но он не будет правильным.

Regex regex = new Regex(@"event FILE\[(?<type>[^\]]*)\]::OnProc? ?{;(?<msg>[^}]*)}"); 
+0

Вы хотите получить один строковый символ? –

+0

должен ли он быть списком ключевых значений? –

+0

@TimSchmelter Список строк, а не один – Saber

ответ

0

Спасибо на все ответы. Я думаю, что у меня здесь в зависимости от Regex будет хороший.

Regex regex = new Regex(@"event ACTION\[(?<type>[^\]]*)\]::OnProc {? ?;(?<msg>[^}]*)}"); 
List<ScriptData> Script = new List<ScriptData>(); 
string ScriptTxt1 = List.ScriptComp[0].CompScrTxt; 

//convert first script 
foreach (Match match in regex.Matches(ScriptTxt1)) 
{ 
    Script.Add(new ScriptData(match.Groups["type"].Value, match.Groups["msg"].Value)); 
} 

public class ScriptData 
{ 
    public string Type { get; private set; } 
    public string ScriptMessage { get; private set; } 

    public ActionScriptData(string type, string msg) 
    { 
     Type = type; 
     ScriptMessage = msg; 
    } 

    public ScriptData() 
    { 
     Type = null; 
     ScriptMessage = null; 
    } 
} 
0
string toSplit = "event FILE[2]::OnProc {;? Msg("Step2") } event FILE[test]::OnProc {;? Msg("Step3.1.1") }"; 
string [] splitString = toSplit.split(new string [] {"event FILE"}, String.SplitOptions.None); 

    List<string> parts = new List(); 

    foreach(string s in splitString) 
    { 
     parts.Add({reg ex for []); //psuedocoded because I don't like to figure out regex 
     parts.Add({reg ex for {}); //psuedocoded because I don't like to figure out regex 
    } 

Я уверен, что кто-то может заполнить RegEx, что любит их!

1

Вы можете использовать Split.Extract (подход без Regex):

var list = new List<KeyValuePair<string, string>>(); 
string str = "event FILE[2]::OnProc {;? Msg(\"Step2\") } event FILE[test]::OnProc {;? Msg(\"Step3.1.1\") }"; 

List<string> events = Split.Extract(str, "event", "event"); 
foreach (string e in events) 
{ 
    list.Add(new KeyValuePair<string, string>(
     Split.Extract(e, "FILE[", "]").First(), 
     Split.Extract(e, "{", "}").First() 
    )); 
} 

И дополнительный Split Класс:

public class Split 
{ 
    public static List<string> Extract(string source, string splitStart, string splitEnd) 
    { 
     try 
     { 
      var results = new List<string>(); 

      string[] start = new string[] { splitStart }; 
      string[] end = new string[] { splitEnd }; 
      string[] temp = source.Split(start, StringSplitOptions.None); 

      for (int i = 1; i < temp.Length; i++) 
      { 
       results.Add(temp[i].Split(end, StringSplitOptions.None)[0]); 
      } 

      return results; 
     } 
     catch (Exception e) 
     { 
      throw new Exception(e.Message); 
     } 
    } 
} 

(мне не нравится осложненный Regex: P)

Смежные вопросы