2011-06-26 17 views
6

Necesito construir una expresión regular que encuentre la palabra "int" solo si no es parte de una cadena.Ayuda para crear una expresión regular

Deseo encontrar si int se usa en el código. (No en alguna cadena, sólo en código regular)

Ejemplo:

int i; // the regex should find this one. 
String example = "int i"; // the regex should ignore this line. 
logger.i("int"); // the regex should ignore this line. 
logger.i("int") + int.toString(); // the regex should find this one (because of the second int) 

gracias!

+0

La expresión regular debería funcionar en Java o ¿aplica la expresión en el código de Java? –

+0

Necesito solo para checkStyle – Adibe7

+0

¿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

Respuesta

4

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.

0

No exactamente seguro de lo que sus requisitos son completos pero

$\s*\bint\b 

quizá

0

Suponiendo que la entrada será cada línea,

^int\s[\$_a-bA-B\;]*$ 

que sigue las reglas de denominación de variables básicas :)

0

Si cree que va a analizar código y buscar la palabra aislada int, esto funciona:

(^int|[\(\ \;,]int) 

Usted puede usarlo para encontrar que, en int el código solo puede estar precedido por espacio, coma, ";" y dejó paréntesis o ser la primera palabra de la línea.

Puede probar aquí y mejorarlo http://www.regextester.com/

PD: esto funciona en todos los casos de prueba.

0

$ [^ "] * \ Bint b

debería funcionar \. No puedo pensar en una situación en la que se puede utilizar un identificador int válida después del carácter '"'. Por supuesto, esto solo se aplica si el código está limitado a una declaración por línea.

Cuestiones relacionadas