Regex в Java, интерпретирующий файл source.c - PullRequest
0 голосов
/ 30 августа 2011

Мне нужно распознать некоторые символы в файле .c. Сейчас я должен распознать строку #define, но я хотел бы исключить комментарии после определения. Например:

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */

У меня есть такие результаты:

group1="KERNEL_VERSION"
group2="(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */"

Я бы хотел избавиться от /* We're doing kernel work */

Я перепробовал все, что просто не могу от этого избавиться. Вот где я нахожусь:

Pattern cdef = Pattern.compile("^#[\\t ]*define[\\t ]+(\\w+)[\\t ]*(.*)",Pattern.DOTALL);

Я попытался добавить ^[\\/\\*\\w+] или [\\t ]+^\\/+\\*\\w*\\ ..... в конце строки, но либо я потеряю всю вторую группу, либо она ничего не делает

Большое спасибо,

!!!! РЕДАКТИРОВАТЬ: Я хотел бы найти способ удалить комментарий C так: / * комментарий * / из шаблона

РЕДАКТИРОВАТЬ 2: То, как я это вижу, я думаю, что должен быть способ дать следующее иструкция: "если вы найдете" / ", больше ничего не принимайте, я читаю файл построчно, чтобы можно было выбросить все, что находится после / :

Здесь я обрабатываю вторую группу: ".... (. )" Поэтому я попытался добавить ^ [\ / \ ] в конец моей строки, но это не работает и Я теряю всю вторую часть

Ответы [ 2 ]

1 голос
/ 30 августа 2011

У вас почти есть это. Просто укажите комментарий в конце вашей строки. Как это:

(\\/\\*.*\\*\\/)

Полная программа испытаний:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestMain {
    public static void main(String[] args) {
        Pattern cdef = Pattern.compile("^#[\\t ]*define[\\t ]+(\\w+)[\\t ]*(.*)(\\/\\*.*\\*\\/)", Pattern.DOTALL);
        Matcher matcher = cdef
                .matcher("#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */");
        System.out.println(matcher.matches());
        for (int n = 0; n <= matcher.groupCount(); n++)
            System.out.println(matcher.group(n));
    }
}

Выход:

true
#define KERNEL_VERSION(a,b,c) ((a)/65536+(b)/256+(c)) /* We're doing kernel work */
KERNEL_VERSION
(a,b,c) ((a)/65536+(b)/256+(c)) 
/* We're doing kernel work */
0 голосов
/ 30 августа 2011

Для меня самый простой способ - это предварительно обработать последовательность символов char-by-char и пропустить все как:

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