wie innere Spiele in lex auswählen
-
03-07-2019 - |
Frage
bin neu in lex und ich will alle Spiele spezifisch für einen regulären Ausdruck nehmen
zum Beispiel in dem folgenden Text:
/* text text
text
text
text */
text text
/* text text text text text text
text text */
ich will wählen, um die beiden Spiele zwischen / * und * /
aber lex entspricht das gesamte äußeren Spiel und doen't die beide wieder! Ich benutze diesen Ausdruck:
\/\*(.|\n)*\*\/
Wie innere Begegnungen statt des gesamten äußeren, einer auszuwählen? danke
Lösung
\/\*([^*]|\n|\*+[^*/])*\*+\/
Was ist hier los ist, dass * gierig ist - es so lange einer Zeichenkette wie möglich übereinstimmen. Der vorhergehende Ausdruck behandelt das Zeichen * getrennt, indem sichergestellt wird, dass der reguläre Ausdruck nur so lange fortgesetzt werden kann, da es nicht durch das Zeichen / anschließt. Dies wird erreicht durch die Inneneinheiten des regulären Ausdrucks mit einer der folgenden sein
- ein Zeichen, das nicht * ist
- ein Newline
- eine Reihe von * s gefolgt von einem Zeichen, die nicht / sind
Am Ende gibt es eine Reihe von * s durch eine / gefolgt. (Anmerkung:.?. Eine frühere Version nicht diesen Fall behandeln hätte richtig ich wünsche wirklich, dass flex den Operator * hatte)