這不會是防彈的,但這適用於所有測試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