Это не будет пуленепробиваемым, но это работает для всех ваших тестовых случаев:
(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\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);
}
Вывод (включая регулярное выражение, так что вы можете читать его без всех этих \
экранирований):
(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\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 */
и т. Д.