• 6 odgovora
  • 2.777 pregleda
RegEx za nested curly brackets 20.08.2011. u 11:09 · pre 184 meseci #1
Pozdrav, imam ovakav input string:
Code:

Main {
 name 1 = value 1
 name 2 = value 2
}
Main {
 name 1 = value 1
 name 2 = value 2
sub {
name 1 = value 1
...
}
}

i ovakav regex (trenutno)
Code:

Main\s*?{(?<OptionsParams>[^}]+)}


Kako da moj regex uhvati sve sto je i u donjem delu "Main" tj. da poklopi pravilno "}" zagradu koju treba a ne prvu na koju naleti.
Potpis

My IT View Of Life-BrLOG-Delphi for PHP


» LinkedIn
Re: RegEx za nested curly brackets 20.08.2011. u 12:03 · pre 184 meseci #2
u .net-u se to zove balancing expression, a mislim da je kod ostalih to nemoguće napraviti samo sa regex-om
Potpis
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
Re: RegEx za nested curly brackets 20.08.2011. u 20:33 · pre 184 meseci #4
Jes' da je funkcija token_get_all() po definiciji namenjena tokenizovanju nekog PHP kôda, ali mislim da bi ona ipak mogla da "proguta" taj tvoj snippet. Vidi onda šta možeš da izvučeš iz tog niza... Skoro sam siguran da bi onda mogla da se odradi ta neka simulacija balansiranja grupa, koja postoji u C# jeziku, nešto tipa:
Code:
$tokens = token_get_all($string);

$match = array();
$buffer = '';
$openBraces = null;

foreach ($tokens as $token) {
    if (is_array($token)) {
        $type    = $token[0];
        $value   = $token[1];
        $lineNum = $token[2];
        
        if ($type === T_STRING) {
            $buffer .= $value;
        }
        
        if ($openBraces === 0) {
            $match[] = $buffer;
            $buffer = '';
        }
    } else {
        if ($token == '{' || $token == '}') {
            if (null === $openBraces) {
               $openBraces = 0; 
            }
            
            if ($token == '{') {
                $openBraces++;
            } else {
                $openBraces--;
            }
        }
    }
}

To sam pisao onako iz glave, ali valjda će ti dati neku ideju...
Re: RegEx za nested curly brackets 20.08.2011. u 20:41 · pre 184 meseci #5
btw Sad sam probao, ipak to neće moći tako kao što sam ja zamislio. Taj string koji hoćeš da tokenizuješ mora da počinje sa "<?php" da bi ga ta funkcija uopšte rasparčala po tokenima kako valja, a to što kôd mora da bude PHP sintaksno ispravan je drugi, još veći problem.
Re: RegEx za nested curly brackets 24.08.2011. u 18:49 · pre 184 meseci #6
Code:

            string _formula = "~~~~~~~~~~~~~~~~~~"; //tvoj string
            string _newFormula = ""; //pomocna promenljiva 
            
            while (_formula.IndexOf("{") >= 0)
            {
                //Odredjujemo najdublje zagrade u stringu
                int levelOfBracket = 0;
                int indexOfOpenBracket = -1;
                int indexOfClosedBracket = -1;
                
                int currLevel = 0;
                int currLevelOfOpenBracket = -1;

                for (int i = 0; i < strlen(_formula); i++)
                {
                    if (_formula[i] == "{")
                    {
                        currLevel++;
                        currLevelOfOpenBracket = i;
                    }

                    if (_formula[i]== "}")
                    {
                        if (currLevel > levelOfBracket)
                        {
                            levelOfBracket = currLevel;
                            indexOfClosedBracket = i;
                            indexOfOpenBracket = currLevelOfOpenBracket;
                        }

                        currLevel--;
                    }
                }

                // secemo sve od pocetka do najdublje zagrade, obradjujemo podatke koji su u najdubljim zagradama, i lepimo ostatak...
        // i tako sve dok ima zagrada...
                _newFormula = substr(_formula, 0, indexOfOpenBracket);
                _newFormula += UradiNestoSaNajdubljimZagradama(substr(_formula, indexOfOpenBracket + 1, indexOfClosedBracket - indexOfOpenBracket - 1)));
                _newFormula += substr(_formula, indexOfClosedBracket + 1);

                _formula = _newFormula;
            }            



ideja je da se nadju najdublje zagrade prvo, isece sve izmedju njih, i odradi neka custom funkcija, i vrati rezultat umesto tog dela (ili se jednostavno odstrani taj deo posle custom funkcije). Ponovo se odradjuje isto, sve dok se ne dodje do kraja...

Nisam probao za tvoj konkretan primer, ali probaj, poenta je u ideji, sad koliko je dobra, necu da sudim, ali meni je odradila posao :)))
Re: RegEx za nested curly brackets 15.09.2011. u 10:52 · pre 183 meseci #7
Sorry, tek sad videh da je neko ovde odgovarao :)

Nasao sam resenje ovde.

Code:

function parse_section($section, $input) {
    $re = '/^\s*' . $section .'\s*{\s*|}$/s';
    $input = preg_replace($re, '', $input);
    $re = '/\s*}\s*' . $section .'\s*{/s';
    return preg_split($re, $input);
}


// using example
$mainSections = parse_section('Main', $input);
print_r($mainSections);
Potpis

My IT View Of Life-BrLOG-Delphi for PHP


» LinkedIn
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme