• Вопрос для гуру регулярных выражений

    @Bonart
    Классические регулярные выражения из математики такую задачу не решают. Но на практике последние версиии популярной библиотеки PCRE умеют:
    my $bal = qr/
        (?<bal>            # Name the rule (optional)  
        \{                 # Open brace
        (?>                # Possessive subgroup
            (?> [^{}]+ )   #  Grab all the non braces
        |                  #    or
            (?&bal)        #  Recurse
        )*                 # Zero or more times
        \}                 # Close brace
        )                  # End named rule
    /x;
    
    if ('{x{x}y{x}x}' =~ /^$bal$/ ){
        print "It's balanced\n";
    }
    
    $_= 'XXXX function xxx() {x{x}y{x}x} XXXX';
    
    while ( /\bfunction\s+(\w+)\(\)\s*($bal)/g ){
        print "function: $1\nbody: $2\n";
    }
    


    Да и дотнет не отстает:

    string pattern = 
        @"^((?<openBracket>\{) | [^\{\}] |" + 
        @"(?<closeBracket-openBracket>\}))*" +
        @"(?(openBracket)(?!))$";
    Regex r = new Regex(pattern, RegexOptions.IgnorePatternWhitespace);
    
    Ответ написан
    Комментировать
  • Вопрос для гуру регулярных выражений

    @Ano
    В некоторых языках работают рекурсивные выражения:

    \( (?: [^()] *+ | (?0) )* \)

    В некоторых языках можно читерить (PERL):

    $regex = qr/
      \(
        (
          [^()]+
        |
          (??{$regex})
        )*
      \)
    /x;
    


    (Ruby)

    re = %r{
      (?<re>
        \(
          (?:
            (?> [^()]+ )
            |
            \g<re>
          )*
        \)
      )
    }x
    
    Ответ написан
    Комментировать