• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyrażenia regularne - grupy

VPS Starter Arubacloud
0 głosów
509 wizyt
pytanie zadane 15 października 2020 w Java przez amtrax Dyskutant (9,630 p.)

Cześć, 

chcę z podanego tekstu wyodrębnić fragmenty liter, które występują między minusami, następnie zapisać je w grupach, aby potem przeprowadzić na nich pewne operacje.

Dlaczego w moim kodzie, program pokazuje jedną grupę, gdzie powinno być ich 5? 

 

String wyrazenie = "aaaaa-bbb-z-y-x-123[abxyz]";


        Pattern pattern = Pattern.compile("([a-z]+)-+");
        Matcher matcher = pattern.matcher(wyrazenie);
        matcher.find();
        System.out.println(matcher.groupCount());

 

1 odpowiedź

+1 głos
odpowiedź 15 października 2020 przez Tomek Sochacki Ekspert (227,490 p.)
wybrane 15 października 2020 przez amtrax
 
Najlepsza

Dawno nie pisałem w Javie z użyciem regexp, ale wydaje mi się, że chyba nie ma tam czegoś na wzór flagi global w JS itp., a gdybyś spróbował zrobić:

while (matcher.find()) {
    System.out.println(matcher.group());
}

i można by tego regexp zamienić na coś w stylu: 

([a-z]+)(?=-|$)

czyli aby wyszukał [a-z], po którym jest znak myślnika, ale tego myślnika niech nie zapisuje.w grupie (chyba, że jego również chcesz). Wtedy nie trzeba będzie obrabiać stringów i usuwać myślników. Nie pamiętam tylko czy taki zapis w Javie jest oki (częściej pracuję z regexp w JS).

Metoda matcher.groupCount() wydaje mi się, że zlicza liczbę dopasowanych grup w danej iteracji, czyli dla każdego wywołania matcher.find zwróci jedną grupę.

2
komentarz 15 października 2020 przez Tomek Sochacki Ekspert (227,490 p.)

Można też zrobić coś takiego:

matcher
.results()
.map(MatchResult::group)
.collect(Collectors.toList())

i mamy ładną listę naszych dopasowań, wszystko zależy od tego co dalej chcesz z tym robić

komentarz 15 października 2020 przez amtrax Dyskutant (9,630 p.)
Dziękuje za odpowiedź,

najbardziej co mnie nakierowało, to pętla while i spostrzeżenie z matcher.groupCount()
Teraz w pętli zapisuje do tablicy String wyszukane wyrazy ;)

Pozdrowienia
komentarz 15 października 2020 przez Tomek Sochacki Ekspert (227,490 p.)
to może użyj tego rozwiązania z results() i map, nie będziesz musiał tworzyć pętli. Ale to już co kto woli, ja raczej wolę użycie metod map i collect, ale można też pętlą :)
komentarz 15 października 2020 przez amtrax Dyskutant (9,630 p.)
Tak, zdecydowanie, zapis w stylu strumieni jest o wiele lepszy.

Pytanie póki jesteśmy w temacie wyrażeń regularnych,
jeżeli chcę aby silnik wyszukał litery znajdujące się pomiędzy [ ], jak mogę je oznaczyć (nawiasy) w pattern.compile? To samo dotyczy również, m.in znaków zapytania, gwiazdki kropki etc.?
komentarz 15 października 2020 przez Tomek Sochacki Ekspert (227,490 p.)
niezbyt rozumiem pytanie, najlepiej podaj jakieś konkretne przykłady, będzie łatwiej.
komentarz 15 października 2020 przez amtrax Dyskutant (9,630 p.)

Chcę aby pokazane (odfiltrowane )zostały  wyrazy,
które znajdują się pomiędzy nawiasami -> [ ]

czyli w tym przypadku: "abxyz". 

 

Kolejny problem, który pojawił się po rozwiązaniu pierwszego, to:
dlaczego w kodzie:

String wyrazenie = "aaaaa-bbb-z-y-x-123[abxyz]";
        String c="";

        Pattern pattern = Pattern.compile("-*([a-z]+)-+");
        Matcher matcher = pattern.matcher(wyrazenie);


        while(matcher.find())
            c += matcher.group();

        System.out.print(c);

Wynikiem na wyjściu są litery wraz z myślnikami,
 

aaaaa-bbb-z-y-x-

 

czy wskazanie:


  ([a-z]+)
        

 nie powinno ich "wyrzucić"?

Dość złożone jest zagadnienie wyrażeń regularnych indecision
 

 

 

komentarz 15 października 2020 przez Tomek Sochacki Ekspert (227,490 p.)
ciąg "123[abxyz]" nie zostaje dopasowany, ponieważ próba dopasowania "wywala się" po trafieniu na nawias "[", którego Twój wzorzec nie obejmuje. Ale niezbyt rozumiem co dokładnie chciałbyś osiągnąć... najlepiej pokaż ciąg wejściowy i oczekiwane grupy jakie ma dopasować regexp. W regexp sprawdza się podejście z napisaniem najpierw testów unitowych, do których dobiera się implementację :)
komentarz 15 października 2020 przez amtrax Dyskutant (9,630 p.)

Chodzi mi teraz o zupełnie nowe wyrażenie, konkretnie o warunek który trzeba w nim zawrzeć. 

Przy takich danych wejściowych:

String wyrazenie = "aaaaa-bbb-z-y-x-123[abxyz]";

chciałbym osiągnąć następujący wynik:

abxyz

Mój problem polega na tym, że nie wiem jak zapisać warunek, który by grupował od nawiasu "[", i aż do nawiasu: "]".

1
komentarz 15 października 2020 przez Tomek Sochacki Ekspert (227,490 p.)
\[[a-z]+\]

czyli dopasuj znak "[", po nim [a-z]+ czyli min. jedno wystąpienie znaków ASCI z zakresu a-z, po nim kolejny znak "]". Przed dopasowaniem bezpośrednio nawiasów [ lub ] trzeba użyć znaku ucieczki. Można co prawda w pewnych przypadkach je pominąć ale ja jestem zwolennikiem aby zawsze podawać je jawnie.

komentarz 15 października 2020 przez amtrax Dyskutant (9,630 p.)
Jesteś wielki!

Podobne pytania

0 głosów
0 odpowiedzi 870 wizyt
pytanie zadane 12 listopada 2016 w Java przez chris Gaduła (3,680 p.)
0 głosów
2 odpowiedzi 355 wizyt
pytanie zadane 10 czerwca 2023 w JavaScript przez andrzej.polak Nowicjusz (220 p.)
0 głosów
1 odpowiedź 350 wizyt
pytanie zadane 9 stycznia 2022 w Matematyka, fizyka, logika przez dark41 Użytkownik (760 p.)

92,973 zapytań

141,937 odpowiedzi

321,175 komentarzy

62,301 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...