• 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
346 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,510 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,510 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,510 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,510 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,510 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,510 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 649 wizyt
pytanie zadane 12 listopada 2016 w Java przez chris Gaduła (3,680 p.)
0 głosów
2 odpowiedzi 246 wizyt
pytanie zadane 10 czerwca 2023 w JavaScript przez andrzej.polak Nowicjusz (220 p.)
0 głosów
1 odpowiedź 328 wizyt
pytanie zadane 9 stycznia 2022 w Matematyka, fizyka, logika przez dark41 Użytkownik (760 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...