regex um funktionsname + argumente zu bekommen
-
hi,
ich moechte einen regex verwenden um funktionsnamen + argumente zu extrahieren. leider funktioniert der match noch nicht ganz:
GameEngine_Verify(State, SafeState);
ausgabe sollte sein:
GameEngine_Verify
State
SafeStatemeine ausgabe:
GameEngine_Verify
eregex:
var myExp1 = regexp.MustCompile(`([a-z-A-Z_]+)\(([a-z-A-Z-0-9\s"][\),\s]{0,1}){0,}\)`) func main() { params := myExp1.FindStringSubmatch("GameEngine_Verify(State, SafeState);") for _, p := range params { fmt.Println(p) } params = myExp1.FindStringSubmatch("SetX(5);") for _, p := range params { fmt.Println(p) } params = myExp1.FindStringSubmatch("SetY();") for _, p := range params { fmt.Println(p) } }
hier der code zum testen:
http://play.golang.org/p/SKNv4fDVxp
-
ich bin der loesung einen schritt naeher gekommen:
regexp.MustCompile(`([a-z-A-Z_]+)\(([a-z-A-Z-0-9"]+[\),\s]*)*\)`)
jedoch wird der erste parameter ("State") noch nicht gematched, warum nicht?
GameEngine_Verify(State, SafeState) GameEngine_Verify SafeState
-
Das ist ein grundsätzliches Problem, wie man in Go alle Groups anzeigt.
rp := regexp.MustCompile(`(\w)+`) params := rp.FindStringSubmatch("abc") for _, p := range params { fmt.Println(p) }
gibt bei mir auch nur den letzten aus ("abc\nc").
Also von Hand ausschreiben: http://play.golang.org/p/oU_9EX1Y6N
var myExp1 = regexp.MustCompile(`([a-zA-Z_]\w+)\s*\(\s*([\w"']+)?(?:\s*,\s*([\w"']+))?\s*\)`)
Geht nur für null, ein oder zwei Argumente, wenn mehr gewünscht ist einfach den hinteren Teil kopieren.
-
ich habs teilweise gefixed:
var reg = regexp.MustCompile(`([\w\d_]+)\(([\w\d"]*)[,\s]*([\w\d"]*)\)`)
wo liegt nun der unterschied zu deinem?
-
Warum benutzt die nicht einfach die Stdlib-Packages go/{ast,parser,scanner} usw. anstatt mit regulären Ausdrücken rumzufummeln? Die Argumentliste eines Funktionsaufruf besteht aus praktisch beliebigen Go-Expressions, genauso wie der Teil links der öffnenden Klammer. Das kannst du mit regulären Ausdrücken nicht mehr machen.
-
regex geaendert zu:
regexp.MustCompile(^[^/]+(([\\w\\d_]+)\\(([\\w\\d"]*)[,\\s]*([\\w\\d"]*)\\))
)Die Argumentliste eines Funktionsaufruf besteht aus praktisch beliebigen Go-Expressions??
-
sorry muss mich korrigieren
`(^[^/]+[\w]+)\(([\w]*)[,\s]*([\w]*)\)`
-
^\s*\w+\((\s*(\w)\s*,?)\)\s$
Nur mal so hergemacht..:)