регулярные выражения C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Igorok, 24 May 2011.

  1. Igorok

    Igorok New Member

    Joined:
    12 Mar 2011
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    Нужно распарсить одним регулярным выражение строку вида:
    ident('d',"asdf",gft, 'a', "asdasdas");

    'a' - символ, содержиться только одна буква|цифра
    "asdf" - строка, как буквы, так и цифры
    gft - просто параметр
    ident - идентификатор

    Все маркеты могут быть разбросаны (т.е те которые внутри скобки)

    Я начал делать, получилось распарсить только несколькими регулярными выражениями. Но хочу узнать, можно ли распарсить одним.
    PHP:

                
    //MatchCollection str = Regex.Matches(line, "\"[a-zA-Z0-9]+\"");
                //foreach (Match m in str)
                //    richTextBox1.AppendText("Строка - " + m.Value + "\n");

                //MatchCollection ch = Regex.Matches(line, @"'[a-zA-Z0-9]{1}'");
                //foreach (Match m in ch)
                //    richTextBox1.AppendText("Символ - " + m.Value + "\n");

                //MatchCollection param = Regex.Matches(line, @"[,| ]([a-zA-Z0-9]+)[,|\)| ]");
                //foreach (Match m in param)
                //    richTextBox1.AppendText("Параметр - " + m.Groups[1].Value + "\n");
    Одним пробывал так
    PHP:
                string line textBox1.Text;
                
    MatchCollection ident Regex.Matches(line, @"^([a-zA-Z0-9]+)(\(('[a-zA-Z0-9]{1}')|(.*?)\));$");
                foreach(
    Match m in ident)
                {
                    for (
    int i 0m.Groups.Count;i++ )
                        
    richTextBox1.AppendText("Идентификатор - " m.Groups[i].Value "\n");
                }
    Ещё не дописал, поскольку возникли вопросы, как экранировать в одном выражении "" и например ()?
     
    #1 Igorok, 24 May 2011
    Last edited: 24 May 2011
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    var line = "ident('d',\"asdf\",gft, 'a', \"asdasdas\");";
    Console.WriteLine(line);
    var reg = new Regex("'(.+)?',\"(.+)?\",(\\w+)?, '(.+)?', \"(\\w+)?\"", RegexOptions.IgnoreCase);
    var m = reg.Match(line);
    foreach (Group group in m.Groups)
    {
    Console.WriteLine(group.Value);
    }
     
  3. Igorok

    Igorok New Member

    Joined:
    12 Mar 2011
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    W!z@rD, спасибо большое, но мне нужно, что бы вот эти символы в кавычках, как одинарных и двойных, стоили в разном порядке!
     
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    в чем проблема?
     
  5. Igorok

    Igorok New Member

    Joined:
    12 Mar 2011
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    ну как бы, я же не знаю в каком порядке будут стоять) вот и проблема)
     
  6. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Не знаю как можно реализовать это на регулярках, но можно примерно так с помощью explode:
    - Убрать из начала `ident(,` а из конца `);`.
    - Разобрать получившеюся строку на массив, используя `,` в качестве разделителя.
    -Сделать цикл пребора каждого элемента массива, проверять - стоят ли одинарные кавычки, двойные или воовсе без кавычек и записывать куда нужно.

    Думаю тебе лучше обратиться к человеку, который понимает регулярки. Думаю это будет выглядеть примерно так:
    Code:
    /^ident\(['|"](.*?)['|"],['|"](.*?)['|"],['|"](.*?)['|"],['|"](.*?)['|"],['|"](.*?)['|"]\);$/
     
    #6 randman, 24 May 2011
    Last edited: 25 May 2011