Datei durchsuchen mit Regex-Ausdruck

H2SO4

Bekanntes Mitglied
Hallo zusammen!

Ich habe folgendes Problem:

Ich möchte eine Datei nach folgendem Muster durchsuchen:

text:abc("xxx")

Wie gesagt, die Datei soll nach dem Vorkommen dieses Musters durchsucht werden. Und jetzt das wichtigste:

Zurückbekommen möchte ich den Teil, der mit xxx markiert ist. Dort kann jedes Zeichen vorkommen, ist aber immer von "" eingeschlossen.

Wie stellt man sowas an?

Danke!
 
Doch... aber wenn du das in ein String packst, musst du noch den Slash zusätzlich escapen:
Java:
String regex = "test:abc\\("(.*?)"\\)";
 
Danke für die schnelle Hilfe! Hat mir sehr geholfen.

Der zu findende Ausdruck ist allerdings etwas komplizierter als gedacht:

1. Ausdruck: "Mage::dispatchEvent\\('(.*?)'(,(.*?))?\\);"
Dieser findet bereits alles was er soll (Wobei in der Datei alle Leerzeichen und Zeilenumbrüche entfernt werden mussten.)

Beispiele:
Mage::dispatchEvent('abc');
Mage::dispatchEvent('abc',$a);
Mage::dispatchEvent('abc',array());
Mage::dispatchEvent('abc',array('a'=>$a));
Mage::dispatchEvent('abd',array('a'=>$a,'b'=>$b));
Mage::dispatchEvent('abc',array('a'=>$a,'b'=>array('c'=>$c)));

Letzteres kann eben sehr verschaltet so weitergehen.


Die erste Gruppe des Regex gibt mir wie gewünscht den Namen des Events: abc
Die zweite Gruppe den Rest.

Für die zweite Gruppe habe ich dann ein neues Regex aufgesetzt. Hinten habe ich ein ; dran gehängt um besser arbeiten zu können, zb. array('a'=>$a,'b'=>array('c'=>$c));.

Ziel soll es sein, a und b zu bekommen, aber nicht c;

Bis jetzt sieht es so aus "array\\((.*?)\\);"


Könntet ihr euch beide Regex bitte nocheinmal anschauen? Beim ersten ist es auch so eine Sache mit dem ,



Der zweite Ausdruck
 
Ich bin mir nicht ganz sicher, dein Problem gänzlich erfasst zu haben, aber es klingt für mich nach einem, das man mit regulären Sprachen (ergo: regulären Ausdrücken) nicht ausreichend beschreiben kann. Um welche Sprache geht es hier eigentlich? C++? Wenn ja: bastel dir einen entsprechenden Parser (oder lade dir wo einen runter, möglicherweise gibt es nämlich schon welche im Internet). Ich glaube jedenfalls nicht, dass du hier mit Regex glücklich wirst (oder ich habe dein Problem nicht gut genug verstanden).

Ark
 
Hallo!

Die Sprache ist PHP; Konkret geht es um das Shopsystem Magento, bei dem an vielen Stellen Events geworfen werden. Die möchte ich alle auflisten, mit den jeweiligen Parametern.

Ich würde also gerne vermeiden wollen, einen komplizierten Parser zu verwenden 😉

Ich suche deshalb nur einen Ausdruck für das oben genannte Problem.

Vielleicht gibt es ja doch eine Lösung?
 
Naja, du könntest ja erstmal mit einem recht simplen RegEx alle Events bekommen. und diese noch anschließend überprüfen und ggf rauswerfen.
 
Hi!

Das habe ich ja schon 😉

Das erste Regex liefert mir aus einer Datei alle Events. Jetzt möchte ich das ganze ja verbessern und noch weitere Informationen. Deshalb wende ich mich ja auch an euch 😉
 
Hi!

Ok, ich versuche es nochmal verständlich zu machen:

Es gibt verschiedene Arten wie so ein Event aufgerufen werden kann.

Beispiele:
Mage::dispatchEvent('abc');
Mage::dispatchEvent('abc',$a);
Mage::dispatchEvent('abc',array());
Mage::dispatchEvent('abc',array('a'=>$a));
Mage::dispatchEvent('abd',array('a'=>$a,'b'=>$b));
Mage::dispatchEvent('abc',array('a'=>$a,'b'=>array('c'=>$c)));

Das müssten alle Arten sein 😉


Was bis jetzt schon funktioniert:

Ich bekomme durch mein Regex den Namen des Events, in den Fällen oben 'abc'.

Ich bekomme auch den Teil hinter dem Komma, wenn es einen Teil gibt 😉

Dieser Teil sind die "zusätzlichen Informationen", die dem Event mitgegeben werden.


Was ich jetzt nur noch möchte ist folgendes:

Die Parameter werden als Array übergeben und sind mit Komma getrennt. array('abc' => Wert, 'abd' => array(...))

Ich möchte einen Regex haben, der mit 'abc' und 'abd' zurückliefert.

Das wäre kein Problem wenn nicht innerhalb des Arrays wieder ein Array als Wert angegeben werden könnte, in dem leider auch 'xyz' => Wert mit , getrennt vorkommen kann.

Ich hoffe jetzt ist alles verständlich erklärt.

Am Ende will ich folgendes haben:

Eventname: 'abc'
Paramter: 'abc' und 'abd'

Der Teil hinter => interessiert nicht 😉
 
Bin zwar kein RegEx-Experte, aber: wie Ark es schon geschrieben hat: hier wirst du mit einem regulärem Ausdruck nicht weiterkommen, denn um die Klammerausdrücke auszugrenzen, musst du die Anzahl der Klammer gespeichert halten. Das ist bei einer regulären Sprache (bzw. Automaten) nicht drin.
Also würde ich dir raten den gesamten "'abc' => Wert, 'abd' => array(...)"-Ausdruck zu nehmen, und mit einer Schleife es selber auswerten.
 

Zurück
Oben