Wyrażenia regularne - zadanie

Wyrażenia regularne - zadanie
3P
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • 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 " "?

edytowany 2x, ostatnio: 3l3ctric_philip
szatkus
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 3 lata
  • Postów:227
1

𐤃𐤐𐤀
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4930
0

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


edytowany 1x, ostatnio: lion137
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:29 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4930
1

PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • 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 :) .


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
edytowany 1x, ostatnio: PerlMonk
Zobacz pozostałe 3 komentarze
PanamaJoe
Tak, wiem @p_agon . Wychodzę ze strefy komfortu. Mogę być kim zechcę.
p_agon
@PanamaJoe: Szczeka twarda po dziadku, sila po wujku Wladku. Powtarzam! Wkraczasz do swiata o ktorym nie masz pojecia! Wypusciles Jina nad ktorym nie masz juz kontroli!
PanamaJoe
cholera :( myślałem, że w tej butelce jest Gin a nie Jin
PerlMonk
@PanamaJoe: Devil Jin :]
p_agon
@PanamaJoe: a na koncu tej drogi jest zloty wor!
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:5 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.


edytowany 2x, ostatnio: elwis
jarekr000000
java sie jakiś czas temu dorobiła wielolinijkowych stringów. ale javowcy jeszcze raczej nie zauważyli :-)
elwis
No to sama radość :D W takim razie pewnie trzeba wczytać cały plik na raz i wycinać z całego pliku.

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.