2016-12-24 3 views
1

Ich möchte Ausdrücke wie diese behandeln:eine beliebige Menge von Zeichen in einem regulären Ausdruck

Ausdruck 1 ->Summe $ 4,8, 'x' $

Ausdruck 2 ->Summe $ 2 , 15, '(x^3 + 3)/(x + 1)' $

und ich reguläre Ausdrücke bin mit dem Muster erkennen:

sum\$[0-9]+[,][0-9]+[,]['][.]*[\w]*[']\$ 

Aber es funktioniert nur für Ausdruck 1, warum Punkt (.), Der ein beliebiges Zeichen darstellt, nicht funktioniert? Muss ich die Klammern in besonderer Weise behandeln?

Antwort

3

. a Meta-Zeichen, das mit jedem 1 Zeichen übereinstimmt. Es gibt andere Metazeichen wie \d, die 1 Buchstabe zwischen 0-9 übereinstimmen. Einige der Meta-Zeichen verlieren ihre spezielle Bedeutung innerhalb der Zeichenklasse []. Daher wird Punkt innerhalb der Zeichenklasse [] kein Metazeichen mehr sein und wird als Literalpunkt behandelt.

.* und .*? sind zwei verschiedene Dinge. Der ehemalige wird gierig alles zusammenpassen und ist später faul. Für z. Nehmen Sie eine Zeichenfolge wie: abbcbbbc. Jetzt a.*c wird die komplette Zeichenfolge übereinstimmen abbcbbbc während a.*?cabbc entsprechen, werden nur

Sie können Etwas Ähnliches versuchen.

sum\$\d+,\d+,'.*?'\$ 

Demo: https://regex101.com/r/6PEfBh/1

0

Die Art und Weise [] Arbeit ist sie Zeichen genau so in Ihrem Fall passen Sie haben so die . ohne [] wie haben:

sum\$[0-9]+[,][0-9]+[,]['].*[\w]*[']\$ 

Diese Regex passt auch Ausdruck 2

+0

Warum diese '' * '' nicht funktioniert [.] [.] ? Was ist der Unterschied bei der Verwendung dieses (abgesehen von der Arbeit) ". *?" @oschlueter –

+0

'[.] *' entspricht einem literalen Punkt-Zeichen, zum Beispiel ".....". Es ist was ich meine mit einem * exact * Zeichenmatch. Wenn Sie den Punkt innerhalb des '[]' haben, hat er nicht die spezielle Bedeutung, sondern ist nur ein Punkt. – oschlueter

0

können Sie versuchen, diese

sum\$[0-9]+[,][0-9]+[,]['][^']*[\w]*[']\$ 

ersetzt mit [^ ']

Verwandte Themen