Поиск строк в коде C с использованием Java - PullRequest
1 голос
/ 10 февраля 2010

Я хочу проанализировать некоторые исходные файлы C и найти все строки ("foo").

Нечто подобное работает

String line = "myfunc(\"foo foo foo\", \"bar\");";
System.out.println(line);
String patternStr = "\\\"([^\"]+)\\\"";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher("");
String s;
if(line.matches(".*"+patternStr+".*"))
matcher.reset(line);
while(matcher.find()) {
    System.out.println(" FOUND "+matcher.groupCount()+" groups");
    System.out.println(matcher.group(1));
}

Пока не будет строк "escape-кавычек", таких как

String line = "myfunc(\"foo \\\"foo\\\" foo\", \"bar\");";

Я не знаю, как создать выражение в Java, например, "без \", но с \. " Я нашел что-то похожее на C здесь http://wordaligned.org/articles/string-literals-and-regular-expressions

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 10 февраля 2010

А как насчет строк внутри комментариев:

/* foo "this is not a string" bar */

и как насчет того, чтобы в комментарии была одинарная двойная кавычка:

/* " */ printf("text");

вы не хотите захватывать "*/ printf(" в виде строки.

Другими словами: если вышеуказанное может появиться в вашем коде C, используйте синтаксический анализатор вместо регулярного выражения.

0 голосов
/ 10 февраля 2010

Между двойными кавычками вы хотите разрешить escape-последовательность или любой символ, отличный от двойных кавычек. Вы хотите проверить их в таком порядке, чтобы дать более длинной альтернативе возможность соответствовать.

Pattern pattern = Pattern.compile("\"((\\\\.|[^\"])+)\"");
Matcher matcher = pattern.matcher(line);

while (matcher.find()) {
  System.out.println(" FOUND "+matcher.groupCount()+" groups");
  System.out.println(matcher.group(1));
}

Выход:

 FOUND 2 groups
foo \"foo\" foo
 FOUND 2 groups
bar
0 голосов
/ 10 февраля 2010

Попробуйте следующее:

String patternStr = "\"(([^\"\\\\]|\\\\.)*)\"";

(Все, что я сделал, это преобразовал в Java регулярное выражение из статьи, которую вы упомянули : /"([^"\\]|\\.)*"/).

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