2017-01-31 6 views
2

Я чувствую себя глупым, чтобы задать самый вероятный глупый вопрос.C# получить первый ';' после круглых скобок

Я помогаю кому-то получить результаты, которые он пожелает для своего пользовательского компилятора, который читает все строки XML-файла в одной строке, поэтому он будет выглядеть ниже, и поскольку он хочет, чтобы он «поддерживал» вызовы переменных внутри массива наихудший сценарий будет выглядеть следующим образом:

"Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];" 

Что мне нужно, это найти первый ";" после того, как "[" и "]" и разделить его, поэтому я стоять с этим:

"Var1 = [5,4,3,2]; 

Он также будет иметь для поддержки нескольких "[", "]", например:

"Var2 = [5,Var1,[4],2];" 

EDIT : Также могут быть данные между последними «]» и «;» Например:

"Var2 = [5,[4],2]Var1; 

Что я могу здесь делать? Я немного застрял.

+3

Разве вы не можете просто разделить строку на '];'? – Equalsk

+0

Забыл упомянуть, что там «могут» быть данные между «]» и «;» Обновленная тема –

+0

Если бы у меня был копейки каждый раз, когда кто-то редактирует свой вопрос и полностью меняет условия ... Во всяком случае, похоже, что Regex будет хорошей ставкой, но я не очень хорош в этом. – Equalsk

ответ

3

Вы можете попробовать регулярные выражения, например.

string source = "Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];"; 

    // 1. final (or the only) chunk doesn't necessary contain '];': 
    // "abc" -> "abc" 
    // 2. chunk has at least one symbol except '];' 
    string pattern = ".+?(][a-zA-Z0-9]*;|$)"; 

    var items = Regex 
    .Matches(source, pattern) 
    .OfType<Match>() 
    .Select(match => match.Value) 
    .ToArray(); 

    Console.Write(string.Join(Environment.NewLine, items)); 

Результат:

Var1 = [5,4,3,2]abc123; 
    Var2 = [2,8,6,Var1;4]; 
+1

Вы проверили регистр для '] Var1;'? –

+0

проверяю. Он отлично работает в этой строке '' Var1 = [5,4,3,2]; Var2 = [2,8,6, Var1; 4]; Var3 = [5,4,3,2]; Var4 = [2 , 8,6, Var1; 4], Var5 = [5, Var1, [4], 2]; Var6 = [5, [4], 2] Var1; "' – Sergio

+0

@Camilo Terevinto: Спасибо! Я вижу редактирование; тогда следует изменить шаблон. –

1
^([^;]+); 

Это регулярное выражение должно работать для всех. Вы можете использовать его как здесь:

string[] lines = 
      { 
       "Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];", 
       "Var2 = [5,[4],2]Var1; Var2 = [2,8,6,Var1;4];" 
      }; 

     Regex pattern = new Regex(@"^([^;]+);"); 

     foreach (string s in lines){ 
      Match match = pattern.Match(s); 
      if (match.Success) 
      { 
       Console.WriteLine(match.Value); 
      } 
     } 

Объяснение:

^означает, что начинается с и
[^;] ничего, кроме запятой
+ означает повторять один или несколько раз и
; следует точка с запятой

Найдет Var1 = [5,4,3,2];, а также Var1 = [5,4,3,2];

Вы можете увидеть выход HERE

+1

Объяснение того, как его использовать и как оно работает, было бы лучше –

0
public static string Extract(string str, char splitOn) 
{ 
    var split = false; 
    var count = 0; 
    var bracketCount = 0; 

    foreach (char c in str) 
    { 
     count++; 
     if (split && c == splitOn) 
      return str.SubString(0, count); 

     if (c == '[') 
     { 
      bracketCount++; 
      split = false; 
     } 
     else if (c == ']') 
     { 
      bracketCount--; 

      if (bracketCount == 0) 
      { 
       split = true; 
      } 
      else if (bracketCount < 0) 
       throw new FormatException(); //? 
     } 
    } 

    return str; 
}