Wyrażenia regularne - zadanie

0

Hej, mam do rozkminienia zadanie programistyczne, w którym muszę wyszukać poprawne instrukcje warunkowe if. Instrukcje, które są zakomentowane, bądź między cudzyuszami nie wchodzą w grę. Na razie rozkminiłem taki kod:

public int getIfCount() {
        String line;
        int counter = 0;

        try {
            BufferedReader bufferedReader = new BufferedReader(new FileReader(this.path));

            Pattern compiledPattern = Pattern.compile("if*(.*)", Pattern.CASE_INSENSITIVE);

            while ((line = bufferedReader.readLine()) != null) {
                Matcher m = compiledPattern.matcher(line);
                while (m.find()) {
                    counter++;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return counter;
    }

Nie podoba mi się ta gwiazdka po ifie. Próbowałem coś takiego, ale "if\s*(.*)", ale nie zlicza poprawnie.

Druga sprawa. Jak wykluczyć komentarze i ify wrzucone między " "?

0

@szatkus: Parsować nie, ale przeszukiwać tekst, jak najbardziej.

0

Przeszukiwanie nie ogarnia kontekstu (bycia w komentarzu, bycia stringi), dlatego trzeba parsować

@3l3ctric_philip żeby zrobić to poprawnie musisz napisać albo znaleźć parser Javy. Nie musi być nawet w Javie

2

Proste dopasowanie linii to

^\s*?if\s*?[(][a-zA-Z _.=+\-*()!]+[)]

Oczywiście to nie wszystkie przypadki, bo brakuje sprawdzania kilku operatorów, ale to sobie autor dopisze :) .

1

Zakładając, że komentarze i napisy są tylko jednolinijkowe, wystarczy dla każdej linijki, przed sprawdzeniem zrobić podstawienie (składnia perla, nie znam Javy):

s/\/\/.*$//g
s/"([\\"|[^"])*"//g

i będzie grało. Dla obsługi wielolinijkowych komentarzy (bo rozumiem, że mamy kody w Javie, więc nie ma wielolinijkowych napisów), trzeba też wykryć wystąpienia /* i jeśli tak jest to wejść w tryb komentarza, w którym tylko szukasz zamknięcia komentarza. Jest to oczywiście mało eleganckie, lepiej byłoby zrobić pełnoprawny lekser, ale przypuszczam, że to nie ten poziom.

1 użytkowników online, w tym zalogowanych: 0, gości: 1