2016-05-19 16 views
1

Ich versuche, Daten innerhalb ${} zu extrahieren.Golang: Daten mit Regex extrahieren

Zum Beispiel sollten die aus dieser Zeichenfolge extrahierten Daten abc sein. Hier

git commit -m '${abc}' 

ist der actua Code:

re := regexp.MustCompile("${*}") 
match := re.FindStringSubmatch(command) 

aber nicht funktioniert, irgendeine Idee?

Antwort

10

Sie müssen $ entkommen, { und } in der Regex.

re := regexp.MustCompile("\\$\\{(.*?)\\}") 
match := re.FindStringSubmatch("git commit -m '${abc}'") 
fmt.Println(match[1]) 

Golang Demo

In regex,

$ <-- End of string 
{} <-- Contains the range. e.g. a{1,2} 

Sie auch

re := regexp.MustCompile(`\$\{([^}]*)\}`) 
+5

Ein Hinweis: Es ist ratsam, ein String-Literal zu verwenden, um ein Regex-Muster zu definieren. Z.B. ['re: = regexp.MustCompile (\' \ $ \ {(. *?) \} \ ')'] (https://play.golang.org/p/jK5TSUGCxt) –

+0

@ WiktorStribiżew ist bereits in einer anderen Antwort ..so habe ich nicht aktualisiert meine – rock321987

+1

Die andere Antwort ist nicht korrekt, denke ich. '+?' und '*?' sind unterschiedliche Quantifizierer. In Regex ist jedes Symbol wichtig und kann die Ausgabe stark verändern. –

1

Versuchen Sie re: = regexp.MustCompile(\$\{(.*)\}) * ist ein Quantifikator, Sie brauchen etwas zu quantifizieren. . würde tun, wie es alles entspricht.

+0

'verwenden können. *' Ist ein gieriges Untermuster und Überfeuer kann. Verwenden Sie mit Vorsicht. Es funktioniert möglicherweise nur mit dem aktuellen Beispiel, aber nicht im realen Szenario. –

+0

Ich sagte nicht, dass es nicht war, er wollte wissen, warum sein Ausdruck nicht funktionierte, ich sagte ihm warum. –

1

Da $, { und } alle haben eine besondere Bedeutung in einem regulären Ausdruck und müssen backslashed werden die eigentlichen Zeichen übereinstimmen, da * nicht so funktioniert, und weil Sie nicht enthalten sind tatsächlich eine Erfassungsgruppe für die Daten, die Sie erfassen möchten. Versuchen:

re := regexp.MustCompile(`\$\{.+?)\}`) 
+0

Das '*' im OP-Muster lässt mich denken, dass die Zeichenfolge in '{}' leer sein kann. Somit scheint die Antwort von Rock näher an dem zu liegen, was OP benötigt. –