Hay, necesito tu ayuda...
Así que tenemos un código de ejemplo en textarea y usaremos expresiones regulares para hacer coincidir todo:
este es el retorno esperado:
(abc) (a) (abc123) (taHandler) (elem) (patrón) (caret_start) (ClassMates) (nombre) (edad) (displayInfo) const str = document.getElementById('val_').value; const regex = /(?<=(let|var|const|function|class)\s+)(\w+)/g; let m; while ((m = regex.exec(str)) !== null) { // avoid infinite loops with zero-width matches if (m.index === regex.lastIndex) { regex.lastIndex++; } // The result can be accessed through the `m`-variable. m.forEach((match, groupIndex) => { if( groupIndex === 2 ){ console.log(`match:(${match})`); } }); } /* we need to match : - class name - function and variable identifier - parameter inside parentheses (...) this is the expected return : (abc) (a) (abc123) (taHandler) (elem) (pattern) (caret_start) (ClassMates) (name) (age) (displayInfo) */ /* edit on regex101: https://regex101.com/r/UCI6Np/1 */ <textarea id="val_" style="width:100%;height:200px;"> this just example code for regex matching purpose: var abc = 123; let a = 'ok'; const abc123 = 'yep'; function taHandler(elem) { let pattern = /\r?\n|\r/, caret_start = elem.selectionStart, caret_end = elem.selectionEnd, elmval_ = elem.value; class ClassMates{ constructor(name,age){ this.name=name; this.age=age; } displayInfo(){ return this.name + "is " + this.age + " years old!"; } } </textarea>Casi lo tenías hecho. Una dificultad que encontré es, como dijiste, hacer coincidir los identificadores de variables separados por comas.
Creo que si comprueba que están precedidos por una coma y seguidos de = (+ espacios en blanco opcionales), estará bastante seguro:
(?<=(let|var|const|function|class)\s+)(\w+)|(?<=,\s+)(\w+)(?=\s*=)|(?<=[\(,])(\w+)(?=[\),])|(?<=}\s+)(\w+)(?=\() Para reconocer funciones en una clase compruebo si están precedidas por } y seguidas por ( (+ espacios en blanco opcionales). De esta manera excluimos el constructor.
He usado esta expresión para leer el código fuente de cpp. esta es una expresión que usé para encontrar el nombre de la función.
"(?<returnType>(\w+(\[\])|\w+\*|\w+))([\n\r\s])(?<methodName>\w+)\s*\((\s*((?:\s*(?<parameterType>(\w+(\[\])|\w+\*|\w+))\s+(?<parameter>\w+)\s*,?\s*))?)+\)"Que puede detectar el nombre de la función como:
Y también capaz de obtener esos nombres en el parámetro.
public void evaluate() { foreach (string data in strData.Split('\n')) { MatchCollection matchs = Regex.Matches(data, @"(?<returnType>(\w+(\[\])|\w+\*|\w+))([\n\r\s])(?<methodName>\w+)\s*\((\s*((?:\s*(?<parameterType>(\w+(\[\])|\w+\*|\w+))\s+(?<parameter>\w+)\s*,?\s*))?)+\)"); foreach (Match match in matchs) { string returnType = match.Groups["returnType"].Captures[0].Value; string methodName = match.Groups["methodName"].Captures[0].Value; var typeParameterPair = new List<KeyValuePair<string, string>>(); int i = 0; foreach (var capture in match.Groups["parameterType"].Captures) { typeParameterPair.Add(new KeyValuePair<string,string>(match.Groups["parameterType"].Captures[i].Value, match.Groups["parameter"].Captures[i].Value)); i++; } FunctionData tempData = new FunctionData(); tempData.returnType = returnType; tempData.methodName = methodName; tempData.parameters = typeParameterPair; funcData.Add(tempData); } } }