Quiero validar un código fuente de C# para un motor de secuencias de comandos. Quiero asegurarme de que solo se haga referencia a los miembros de la clase System.Math. Intento crear una expresión regular que coincida con un punto, seguido de una letra mayúscula, seguida de cualquier número de caracteres de palabra, que termina en una palabra delimitada que NO está precedida por System.Math.Dolor de cabeza Regex
empecé con esto:
(?<!Math)\.[A-Z]+[\w]*
que funciona bien para:
return Math.Max(466.89/83.449 * 5.5); // won’t flag this
return Xath.Max(466.89/83.449 * 5.5); // will flag this
que coincida correctamente .MAX cuando no está precedida de Matemáticas. Sin embargo, ahora que intento expandir la expresión regular para incluir System, no puedo hacer que funcione.
que he probado estas permutaciones de la expresión regular y más:
((?<!System\.Math)\.[A-Z]+[\w]*)
((?<!(?<!System)\.Math)\.[A-Z]+[\w]*)
((?<!System)\.(?<!Math)\.[A-Z]+[\w]*)
((?<!System)|(?<!Math)\.[A-Z]+[\w]*)
((?<!System\.Math)|(?<!Math)\.[A-Z]+[\w]*)
El uso de estas declaraciones:
return System.Math.Max(466.89/83.449 * 5.5);
return System.Xath.Max(466.89/83.449 * 5.5);
return Xystem.Math.Max(466.89/83.449 * 5.5);
He intentado todo lo que podía pensar, pero tampoco SIEMPRE coincide con el segundo elemento (.Math o .Xath anterior) o NO coincide con NADA.
Si alguien tuviera piedad de mí y señalara lo que estoy haciendo mal, lo apreciaría en gran medida.
Gracias de antemano, Welton
Pensé que tenía una solución, pero ahora he redescubierto todas las expresiones enumeradas y también he destruido mi cerebro. ¡Muy complicado! –
Will 'Math. Alguna vez aparecerá solo, o siempre estará precedido por' System'? –
¿Ha considerado usar un compilador (CSharpCodeProvider) y luego usar el gráfico de objetos CodeDom para buscar referencias a cosas que no sean System.Math? Esto sería a prueba de balas, más legible y más flexible. –