regex, split, iteracja

Odpowiedz Nowy wątek
2015-01-29 08:36
0

Split / iteracja [po, czyms, takim] ,aby otrzymać podczas iteracji tylko same słowa?

wymyśliłam coś takeigo, ale nie działa przy slowkach

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String slowka = "[po, czyms, takim]";
        String slowka2 = "[albotakim]";

        Pattern p = Pattern.compile("\\[(.*?)\\]");
        Matcher m = p.matcher(slowka);
        Matcher m2 = p.matcher(slowka2);

        while (m2.find())
            System.out.println(m2.group(1));

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

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!

Pozostało 580 znaków

2015-01-29 08:41
1

A nie możesz szukac po prostu [a-zA-Z]+ ?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-29 08:46
2
public class Main {
    static void wypisz(String s) {
        for (String x : s.substring(1, s.length() - 1).split(", ")) {
            System.out.println(x);
        }
    }

    public static void main(String[] args) {
        wypisz("[po, czyms, takim]");
        wypisz("[albotakim]");
    }
}

Jest spilt, regex (w splicie) i iteracja (w foreachu) :]


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit, 2015-01-29 08:49
Pokaż pozostałe 6 komentarzy
robi to co ma robić, czyli splituje podane ciągi. - Wibowit 2015-01-29 09:48
s.substring(1, s.length() - 2) :P - MarekR22 2015-01-29 09:52
mea culpa nawyki z innego języka/frameworka, gdzie drugi parametr substring określa długość wyniku, a nie indeks końcowy. - MarekR22 2015-01-29 10:27
@MarekR22: lepiej, indeks za ostatnim elementem. Trochę jak w c++ std::end - vpiotr 2015-01-29 10:29

Pozostało 580 znaków

2015-01-29 09:56
1
public class Test {

    @org.junit.Test
    public void testName() throws Exception {
        String slowka = "[po, czyms, takim]";
        String slowka2 = "[albotakim]";
        splitAndDo(slowka, System.out::println);
        splitAndDo(slowka2, System.out::println);
    }

    public void splitAndDo(String input, Consumer<String> s){
        Arrays.stream(input.split(","))
                .map(a-> a.replaceAll("[^a-zA-Z\\p{L}]", ""))
                .filter(b->b.length()>0)
                .forEach(s);

    }
}

split, replace, iteracja.

// edit: dodałem usuwanie pustych ciągów tak by łapało np. [ala, ma, kota, sierściucha, @#[email protected]#[email protected]] choć regex nie łapie polskich znaków już łapie ;)

edytowany 2x, ostatnio: Koziołek, 2015-01-29 13:54

Pozostało 580 znaków

2015-01-31 20:25
the real mućka
0

Jesli chodzi o szybkosc (ktos pytal wczesniej) to wydaje mi sie ze rozwiazanie koziolka jest najgorsze bo wielokrotnie uzywa tych samych regexow: 1. najpierw split(", ") wewnetrznie ich uzywa 2. replaceAll rowniez, przy czym split jest raz, a replaceAll za kazdym razem, dla kazdego elementu.
No ale najwazniejsze ze mozna sie popisac znajomoscia modnych, 'nowoczesnych' lambd i strumieni w jdk8.

Z drugiej strony rozwiązanie teoretycznie jest z automatu możliwe do zrównoleglenia ;) - Shalom 2015-01-31 20:28

Pozostało 580 znaków

2015-01-31 20:50
0

@the real mućka, ale można je wyekstrahować do czegoś już skompilowanego za pomocą Pattern.compile(regex).matcher(str).replaceAll(repl):

static Pattern  p =Pattern.compile("[^a-zA-Z\\p{L}]");
// i dalej:
    public void splitAndDo(String input, Consumer<String> s){
        Arrays.stream(input.split(","))
                .map(a-> p.matcher(a).replaceAll(""))
                .filter(b->b.length()>0)
                .forEach(s);

    }

i od ręki można to zrównoleglić.
Względnie można zrobić splita za pomocą wyrażenia zamieniającego (split("[^\\p{L}]")):

    @Test
    public void testName() throws Exception {
        String slowka = "[po, czyms, takim]";
        String slowka2 = "[albotakim]";
        splitAndDo(slowka, System.out::println);
        splitAndDo(slowka2, System.out::println);
    }

    public void splitAndDo(String input, Consumer<String> s){
        Arrays.stream(input.split("[^\\p{L}]{1,}"))
                .forEach(s);

    }

tylko pytanie, czy w takim wypadku kod nie zaczyna się zbytnio motać na poziomie wyrażenia. Zresztą ciekawe, ze split wyłapałeś, a powtórzenia w grupie, które powoduje znacznie większy narzut już nie...

Pozostało 580 znaków

2015-01-31 21:38
the real mućka
0

Prawde mowiac nawet na tego regexa nie spojrzalem, tylko stwierdzilem fakt na temat tego 'potworka' ;d

Pozostało 580 znaków

2015-02-01 11:16
Czarny Kaczor
0

Splitter.on(",").split(array);

i pozamiatane ;)

Pozostało 580 znaków

2015-02-01 12:04
0

Bardzo daleko od pozamiatania, przeczytaj uważnie pytanie.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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