Помогите построить регулярное выражение - PullRequest
6 голосов
/ 26 июня 2011

Мне нужно создать регулярное выражение, которое находит слово «int», только если оно не является частью какой-либо строки.

Я хочу выяснить, используется ли int в коде.(не в какой-либо строке, только в обычном коде)

Пример:

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)

спасибо!

Ответы [ 5 ]

4 голосов
/ 26 июня 2011

Это не будет пуленепробиваемым, но это работает для всех ваших тестовых случаев:

(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\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 */ и т. Д.

0 голосов
/ 26 июня 2011

$ [^ "] * \ bint \ b

должно работать. Я не могу вспомнить ситуацию, когда вы можете использовать действительный идентификатор int после символа '"'.Конечно, это применимо, только если код ограничен одним оператором в строке.

0 голосов
/ 26 июня 2011

Если вы хотите проанализировать код и найти изолированное int-слово, это работает:

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

Вы можете использовать его, чтобы найти int, которому в коде может предшествовать только пробел, запятая, ";"и оставьте круглые скобки или введите первое слово в строке.

Вы можете попробовать его здесь и улучшить его http://www.regextester.com/

PS: это работает во всех ваших тестовых случаях.

0 голосов
/ 26 июня 2011

Предполагая, что вводом будет каждая строка,

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

следует основным правилам именования переменных:)

0 голосов
/ 26 июня 2011

Не совсем точно, каковы ваши полные требования, но

$\s*\bint\b

возможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...