2009-07-09 8 views
2

Ich habe einen regulären Ausdruck, der alle möglichen Angaben zwischen {und} in meiner Zeichenfolge enthält.So passen Sie das innere mögliche Ergebnis mit regulären Ausdrücken an

"/{.*}/"

kann nicht einfacher sein. Das Problem tritt auf, wenn ich eine einzelne Zeile mit mehreren Übereinstimmungen habe. Also, wenn ich eine Zeile wie diese haben:

das ist mein {string}, nicht wahr {Arbeit} richtig

Die Regex wird

{string} übereinstimmen, dies nicht der Fall {Arbeit}

statt

{string}

Wie bekomme ich es, nur das erste Ergebnis zu entsprechen?

Antwort

11

Frage-Markierung bedeutet „genügsam“

"/{.*?}/" 
+0

Dies ist lesbarer, denke ich. – mkb

+0

ich weiß nicht, ob Sie verschachtelte geschweifte Klammern haben, aber dies wird nicht die gewünschten Ergebnisse zurückgeben, wenn sie da sind. Für {aaa {bbb} ccc} wird {aaa {bbb} zurückgegeben. – Victor

+0

Dies funktioniert wie erwartet, obwohl Victors Punkt ein guter ist. Möglicherweise ein Thema für einen anderen Beitrag ... – Travis

3

eine Zeichenklasse verwenden, die alles außer einer rechten Klammer umfasst:

/{[^}]+}/ 
+0

Das ist eine bessere Angewohnheit als die angenommene Antwort. Für einen komplexeren regulären Ausdruck wird dies nicht dem katastrophalen Zurückverfolgen zum Opfer fallen. http://www.regular-expressions.info/catastrophic.html –

0

Standardverhalten ist gierig Matching, dh zuerst {zum letzten }. Verwenden Sie faulen Abgleich von der? . Nach dem *,

/{.*?}/ 

oder gar nicht * verwenden "nicht a}"

/{[^}]*}/ 
1

dies mit nur einer Tiefe von einem mit einzelnen verschachtelten Klammern arbeiten: {(({.*?})*|.*?)*}

I bin mir nicht sicher, wie man unendliche Tiefe bekommt oder ob es mit Regex überhaupt möglich ist