这不会是防弹的,但这适用于所有测试cas ES:
(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\bint\b(?=([^"]*|[^"]*"[^"]*"[^"]*)$)
它确实一看后面向前看断言,有没有或前两个/以下报价"
以下是一个Java代码与输出:
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);
}
输出(包括正则表达式,所以你可以阅读它没有所有这些\
escapes):
(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\bint\b(?=([^"]*|[^"]*"[^"]*"[^"]*)$)
true: int i;
false: String example = "int i";
false: logger.i("int");
true: logger.i("int") + int.toString();
使用正则表达式永远不会100%准确 - 您需要一个语言解析器。考虑转义引号中的字符串"foo\"bar"
,在线评论/* foo " bar */
等
正则表达式应该在Java中工作还是在Java代码中应用表达式? –
只需要checkStyle – Adibe7
是否需要解析文件以检查程序的GRAMMAR在这种情况下很容易 - 如果以'String'标记开头并以''结尾,则忽略int; – Kamahire