No va a ser a prueba de balas, pero esto funciona para todas sus pruebas cas ES:
(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\bint\b(?=([^"]*|[^"]*"[^"]*"[^"]*)$)
lo hace una mirada atrás y mirar hacia adelante para afirmar que no hay tampoco ninguna o dos anteriores/siguientes citas "
Aquí está el código en Java con la salida:
String regex = "(?<=^([^\"]*|[^\"]*\"[^\"]*\"[^\"]*))\\bint\\b(?=([^\"]*|[^\"]*\"[^\"]*\"[^\"]*)$)";
System.out.println(regex);
String[] tests = new String[] {
"int i;",
"String example = \"int i\";",
"logger.i(\"int\");",
"logger.i(\"int\") + int.toString();" };
for (String test : tests) {
System.out.println(test.matches("^.*" + regex + ".*$") + ": " + test);
}
Salida (incluida la expresión regular para que pueda leerla sin todos esos \
escapes):
(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\bint\b(?=([^"]*|[^"]*"[^"]*"[^"]*)$)
true: int i;
false: String example = "int i";
false: logger.i("int");
true: logger.i("int") + int.toString();
El uso de expresiones regulares nunca será 100% preciso, necesita un analizador de lenguaje. Considere cotizaciones escapado de cuerdas "foo\"bar"
, comentarios en línea /* foo " bar */
, etc.
La expresión regular debería funcionar en Java o ¿aplica la expresión en el código de Java? –
Necesito solo para checkStyle – Adibe7
¿Es necesario analizar el archivo para verificar GRAMMAR del programa en ese caso es fácil? Simplemente ignore int si se inicia con el token 'String' y termina con ';' – Kamahire