Özyinelemeli argümanları ele için Regexp

1 Cevap php

Ben sıradanifade acemi değilim, bu yüzden aşağıdaki için ne regexpi merak ediyorum:

fonksiyon {function arg1, arg2}, arg3

Ben sadece üst düzey argümanlar seçmek edebilmek için arıyorum: {function arg1, arg2} & arg3

İdeal yanıt PHP preg_match kullanarak olacağını, ancak hemen hemen her sıradanifade iyi çalışır.

Thanks! Matt

1 Cevap

PCRE / Perl regex, ama ben sadece (aşağıdaki özellikleri bağlı olarak) ne istediğini tahmin ediyorum:

/(?:function\s+|\G(?<!^),\s*)([^,{}]+|\{function\s+(?1)\s*(?:,\s*(?1)\s*)*})\s*/g

Example Perl kullanımı:

test('function {function arg1, arg2}, arg3');
test('function foo, {function {function x}, y}, bar');

sub test{
    print 'Matched: "', join '", "',
        $_[0] =~
        /(?:function\s+|\G(?<!^),\s*)
        (
            [^,{}]+
            |
            \{function\s+(?1)\s*(?:,\s*(?1)\s*)*}
        )
        \s*/gx;
    print "\"\n";
}

Output:

Matched: "{function arg1, arg2}", "arg3"
Matched: "foo", "{function {function x}, y}", "bar"

Sadece gerektiğinde kaçmak ve preg_match_all kullanmak, PHP sadece iyi çalışması gerekir.

Şartname tho hakkında bir sürü soru:

  • Eğer üzerinde eşleşen dize bundan daha başka bir şey var mı?
  • Iki argüman her zaman var mı?
  • Argümanlar tek bir kelime var mı?
  • "Fonksiyonu" bir anahtar kelime ya da bir işlev adı mı?

Daha (gerçek) örnekler lütfen!