problem w wyrażeniem regularnym w Javie

problem w wyrażeniem regularnym w Javie
HI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

Chcę wykorzystać wyrażenie regularne do odnajdywania w tekście wejściowym deklaracji zmiennych, funkcji i klas. W związku z tym zbudowałem wyrażenia regularne dla :

deklaracji specyfikatora dostepu i typu:

Kopiuj
 

        String wyrazeniespecyfikatordostepu = "(\\s*?(public|static|private|protected|final|abstrac)?(\\s+)?)";
        String wyrazeniedeklaracjitypu = "(String|Boolean|Byte|Character|Short|Integer|Long|Float|Double|Enum|boolean|byte|char|short|int|long|float|double|enum)(\\s+)?(\\[\\s*?\\])*?""; 

Wyrażenia te pojedynczo działają natomiast w połączeniu nie działają nie wiem dlaczego ?
wykorzystywałem do tego funkcję matches klasy String

Kopiuj
        String wyrazeniedeklaracja = wyrazeniespecyfikatordostepu + wyrazeniedeklaracjatypu;
        String wyrazenie = "public String ";
        System.out.println(": " + wyrazenie.matches( wyrazeniedeklaracja));

funkcja matches działa jeśli porównywany String odpowiada całemu wyrażeniu, czy są funkcje w Javie które odnajdą w tekście wyszukiwane wyrażenie ?

iooi
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 573
1

Nie odpowiem ci teraz na pierwsze pytanie, ale co do wyszukiwania, możesz stworzyć Matchera:

Kopiuj
Matcher m = Pattern.compile(wyrazeniedeklaracja).matcher(wyrazenie);

Teraz możesz wołać m.find(), m.group - poczytaj sobie, co to robi.
Btw, zamiast String|Boolean|Byte|Character|Short|Integer|Long|Float|Double|Enum|boolean|byte|char|short|int|long|float|double|enum
można by napisać String|[bB]oolean|[bB]yte|[sS]hort|[lL]ong|[fF]loat|[dD]ouble|[eE]num ... czy coś w ten deseń,
(\\s+)? znaczy tyle co \\s*

__krzysiek85
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1019
1

Do tworzenia parserów polecam użycie jednego z generatorów parserów:
http://java-source.net/open-source/parser-generators

Za pomocą samych wyrażeń regularnych nie da się opisać żadnego sensownego języka programowania. Potrzebna jest gramatyka bezkontekstowa.
Nie da się np. stworzyć wyrażenia regularnego, do którego pasowałyby wszystkie wyrażenia nawiasowe, np. (((((1))+((2)))))
Oczywiście można łączyć wyrażenia regularne z dodatkową logiką, ale lepiej jest napisać gramatykę języka i zlecić stworzenie parsera generatorowi.

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.