Java i wyrażenia regularne.

0

Witam! Otóż chciałem wyciągnąć wszystkie cyfry z ciągu znaków. Mój regex wygląda tak: ".([\d]?)." (tu jego inne wersje: ".(\d).", ".([0-9]).", ".([0-9]).*". I wiele więcej.). A tu ciąg: "jgahsdiKbikutdfjasuidali;skdjuhgashdjuk.eIA12412414HS4UOlhjkoiuaw&^*td UJ". I wyszukuje mi tylko jedną cyfrę (4), a ja chcę, żeby znalazło mi wszystkie, nie znając liczby ich wystąpień. Prosiłbym o pomoc.

PS po kropkach (w regexach) są jeszcze gwiazdki, ale jakoś ich nie wyświetla ;/

0

Nie bardzo rozumiem. \d+ złapie ci wszystkie następujące po sobie cyfry.

0
Shalom napisał(a):

Nie bardzo rozumiem. \d+ złapie ci wszystkie następujące po sobie cyfry.

Właśnie ja też.
Tu daje screeny z środowiska, cmd i online regex testera.

title
title
title

0

Tak to działa, Poczytaj sobie tutorial o regexach i metodach z Matcher:

         Pattern pat1 = Pattern.compile("\\d+");
        Matcher match1 = pat1.matcher("jdiwjd7584dkwjdkw9849384dkwj99");
        while (match1.find()){
            System.out.println(match1.group());
        }/* ->
        7584
        9849384
        99
         */
0
lion137 napisał(a):

Tak to działa, Poczytaj sobie tutorial o regexach i metodach z Matcher:

         Pattern pat1 = Pattern.compile("\\d+");
        Matcher match1 = pat1.matcher("jdiwjd7584dkwjdkw9849384dkwj99");
        while (match1.find()){
            System.out.println(match1.group());
        }/* ->
        7584
        9849384
        99
         */

No okej. Ale dlaczego znajduje TYLKO tą czwórkę, a nie np. pierwszą jedynkę?

0

Twój regex pasuje do dowolnego ciągu, który zawiera choć jedną cyfrę: ".*(\\d+).*", kropka i Kleene Star to powodują. A dlaczego cztery, bo Używasz tej metody group: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int). Użyj tej : https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group()
Żeby wyłuskać tylko cyfry wystarczy "\\d+".

Ps Koniecznie Musisz przerobić jakiś tutorial z regexów, każdy kto programuje musi je znać

0

Błąd polega na tym że używasz "greedy", czyli .* które łyka jak najwięcej się da. Więc jak masz .*\d+ to ten pierwszy łyknie wszystko aż do ostatniej cyfry. Użyj np. .*? zamiast tego, żeby matchować jak najmniej.

0

matches(): Attempts to match the entire region against the pattern.

find(): Attempts to find the next subsequence of the input sequence that matches the pattern.

Czyli matches porównuje Ci cały łańcuch z wzorcem i zwraca true/false.
Natomiast group() stosuje się zwykle po wywołaniu find(). A jeśli wywołujesz go po matches to możesz dostać wynik pasujący do dowolnego możliwego wyniku (w zależności od implementacji).

Reguła uproszczona do maksimum:
a) albo samo matches() albo
b) find() + group()

A jak jesteś jednym z tych którym nie wystarczają dogmaty to przeczytaj implementację z OpenJDK.
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/util/regex/Matcher.java

0

Otóż chciałem wyciągnąć wszystkie cyfry z ciągu znaków.

Już chciałem napisać, że regex nie jest najlepszym narzędziem i że jednym strzałem nie wyciągniesz. Ale od drugiej strony:

s.replaceAll("[^0-9]+", "")

Wszystko, co nie jest cyfrą, zamieni na pusty ciąg, czyli po ludzku - usunie. W sensie zwróci nowy string, w którym pozostaną same cyfry.

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