Regex w Javie - nie umiem dobrać wzorca

0

Cześć, Piszę program, który wczytuje z pliku jakiś kod .java i szuka w nim instrukcji if i ciągów tekstowych.
Próbowałem szukać normalnie wykorzystując Stringi bądź StringTokenizery i metodę contains() np ciągi: "if(" lub """ ale to trochę zgubne.
Chcę to zrobić za pomocą wyrażeń regulowanych, ale czytam i czytam i nic z tego nie rozumiem :/

Jak powinno wyglądać wyrażenie dla instrukcji żeby szukało czegoś takiego "if(dowolna ilość i rodzaj znaków)" i tak samo dla tekstu""(dowolna ilość i rodzaj znaków)""

Za każdą pomoc będę wdzięczny :)

@Edit
udało mi się zrobić wzorzec do instrukcji if - Pattern wzorzec = Pattern.compile("if.(.)");
Jakoś to działa, ale z ciągami znaków sobie nie radzę :/

0

Pamiętamy: Jeśli chcemy użyć znaku używanego przez regex (np. nawias) jako np. wyszukiwany znak, a nie część funkcyjna wyrażenia, to stawiamy przed nim \ (a ponieważ sam znak \ nie może wystąpić, to np. w Javie w jego miejscu podamy \\.

Krótko mówiąc, if.(.) znajdzie ci wszystko, co składa się z if i dwóch znaków, bo nawiasy działają jako określenie można by rzec zakresu. Nie potrafię tego wyjaśnić. Bardziej "poprawnym" jest if.\(.\).

if.\(.\) na moje oko pozwala tylko na jeden znak wewnątrz nawiasu. No i, jeśli nawias będzie pusty, wtedy w miejsce tej drugiej kropki zostanie użyty nawias zamykający, a wtedy klapa, bo drugi nawias znajdzie dopiero w drugim ifie.

if.\(.*\) już może lepiej działać, bo pozwoli na dowolną ilość znaków wewnątrz nawiasów, ale wtedy znajdzie ostatni nawias zamykający w pliku i wszystko między if'em a tym znakiem będzie w tym zawarte. Znowu źle.

if.\([^\)]*\) z kolei zadziała "blisko poprawności" - pozwoli na umieszczenie wewnątrz nawiasu wszystkich znaków z wyjątkiem nawiasu domykającego. Problem jednak zaczyna się, gdy w warunku chcemy zastosować nawiasy, np.

if ((cos == cos2) && (cos != cos3))
Wtedy skończy na if ((cos == cos2, bo później jest nawias zamykający.

Z kolei po kilku minutach szukania znalazłem coś takiego w problemie nawiasów w nawiasie:

That is not possible with regular expressions since regular expressions can only match regular languages and the one you are trying to parse is context-free and not regular

Innymi słowy, na nic ci się regex nie przyda.

0

Zostałem zniszczony :/
Dobra to zadziałam na StringTokenizerze, to będzie nieco łatwiejsze :)

0

@kuba098 nie będzie bo próbujesz parsować język bezkontekstowy metodami które się do tego nie nadają. A raptem wczoraj ( http://4programmers.net/Forum/Newbie/158382-jezyki_automaty_i_obliczenia_jaio_-_czy_z_tego_sie_korzysta ) ktoś pytał o to po co się uczyć teorii automatów i języków ;]
Pytanie brzmi co dokładnie chcesz parsować. Bo jeśli jakis podzbiór języka programowania to proponuje skorzystać z generatora parserów, np. antlr. Inaczej nakombinujesz sie a i tak nie zadziała.

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