Wyrażenia regularne - zadanie

Wyrażenia regularne - zadanie
3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
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:

Kopiuj
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 " "?

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

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

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
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

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
PerlMonk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa 🐪
  • Postów: 1719
2

Proste dopasowanie linii to

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

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

elwis
  • Rejestracja: dni
  • Ostatnio: dni
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):

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.