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
    SafeState

    meine ausgabe:
    GameEngine_Verify
    e

    regex:

    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..:)


Anmelden zum Antworten