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

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top