2016-03-31 14 views
3

Noch eine RegEx Frage. Ich habe viele PHP-Dateien von Array zu ändern ('foo', 'bar') zu neuen Stil [ 'foo', 'bar']Regex ändern "Array()" zu "[]" in Sublime 3

Bisher kam ich mit auf den Punkt:

array\(([^\(]*?)\) 

Aber es nimmt keine mehrzeiligen Definitionen auf. Ich habe so etwas wie dies versucht, aber es ist noch schlimmer, da es falsch schließenden Klammern aufgreift:

(?s)array\(([^\(].*?)\) 

Zum Beispiel, einige Daten, die ersetzt bekommen muss:

$foobar = $this->foobar('foo_bar', array(
    'foo' => array('foobar' => array('barfoo')), 
    'bar' => array(
     'bar' => 'foobar', 
     'foo' => 'barfoo', 
))); 

So das obige Beispiel würde so aussehen:

$foobar = $this->foobar('foo_bar', [ 
    'foo' => ['foobar' => ['barfoo']], 
    'bar' => [ 
     'bar' => 'foobar', 
     'foo' => 'barfoo', 
]]); 

Jeder? Vielen Dank!

+1

Warum würden Sie das tun? –

+0

Meinst du das? ['(?: array \() (. *)? \)'] (https://regex101.com/r/tP3aN5/1) – Shafizadeh

+1

Matei Mihai, frag mich bitte nicht =) es ist nicht mein Ruf, Wir aktualisieren ein altes Projekt in ein neues Framework. Daher ändern wir die Array-Definitionen zusammen mit . – lime

Antwort

5

In Sublime Text, mehrere Pässe mit

\barray(\(((?>[^()]++|(?1))*)\)) 

verwenden können und ersetzen mit [$2].

das Muster übereinstimmt:

  • \b - führende Wortgrenze
  • array - eine wörtliche Zeichensequenz array
  • (\(((?>[^()]++|(?1))*)\)) - Gruppe 1 Matching verschachtelt, gepaart Klammern und den Inhalt zwischen paarigen Klammern Erfassung in Gruppe 2 (deshalb müssen Sie Gruppe 2 mit $2 im Ersatz referenzieren).
+1

Ich werde Demo und Screenshot hinzufügen, wenn ich auf meinem Desktop bin. Froh, dass ich Helfen kann. –

+0

Ich habe immer noch wenig Zeit, aber ich werde hinzufügen, was ich versprochen habe. –

+0

Funktioniert gut, aber vergessen Sie nicht zu wiederholen, bis alle verschachtelten 'array()' Aufrufe ersetzt sind. – skerit

0

Diese Regex sollte keine Probleme über Liniengrenzen übereinstimmen, aber es ist falsch. [^\(].*? versichert, dass das erste Zeichen nach der öffnenden Klammer nicht ein anderes offenes Zeichen ist, aber danach geht alles. Sie möchten sicherstellen, dass alle Zeichen keine Klammern sind (öffnen oder schließen). Das ist alles, was Sie brauchen:

array\(([^()]*)\) 

mit [$1] ersetzen. Natürlich müssen Sie mehrere Durchgänge machen, bis es keine Übereinstimmungen mehr gibt.

Ich gehe davon aus, dass es nie Klammern geben wird, die nicht Teil einer array(...) Struktur sind; Da ist es, der Job wird viel komplizierter.

+0

Das hat nicht funktioniert. Und ja, es gibt viele Klammern, die nicht Teil des Arrays (...) innerhalb und außerhalb der Definitionen sind. – lime

+0

Okay, dann brauchen wir ein vollständigeres Beispiel. –

4

Soweit ich weiß Python Regex unterstützt nicht die Verschachtelung von Klammern und Regex sind im Allgemeinen nicht für diese Aufgaben empfohlen. Wenn Sie kein Programm schreiben wollen, aber tun Sie es in ST würde ich empfehlen und andere Ansatz. Das Surround-Paket macht einen guten Job beim Ändern der umgebenden Klammern. Sie können es installieren Sie eine dann:

  1. alle Array auswählen beginnt
  2. das Array Stichwort
  3. Bewegung innerhalb der zu Zahnspange
  4. Änderung der umliegenden Pars Pars löschen. Um dies zu tun, drücken Sie ctrl+shift+p und schreiben Sie Surround: change surround. Geben Sie ) in das erste Eingabefeld und ] in das zweite Eingabefeld ein. (Wenn Sie [ einfügen wird es einen Zusatz Raum nach innen addieren.)

Demonstration:

toggle_php_array_demo

+2

S & R verwendet Boost Regex Flavour, nicht Python. Es unterstützt Rekursion. –

+0

@ WiktorStribiżew danke, gut zu wissen –

+0

Das ist wirklich nett! Ich könnte es auch benutzen. Danke dafür! – lime