problem w wyrażeniem regularnym w Javie

problem w wyrażeniem regularnym w Javie
HI
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 14 lat
  • 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:prawie 15 lat
  • Ostatnio:ponad 11 lat
  • 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*

edytowany 3x, ostatnio: iooi
__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • 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.


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5

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.