Problem z regex

0

Mam drobny problem z regex'em
Mam taki string

String text = "salon pokój kuchnia pokój pokój";
text.replaceAll("[pokój]", "-");

Chce zamienić słowo "pokój" na "-"
Problem w tym, że gdy jest dwa razy pokój jak w tym przypadku to na końcu dostaje dwa razy --
Jak zrobić gdy są dwa wyrazy obok siebie to aby zamieniało na jeden - ?

1

U mnie ta twoja wersja robi co innego niż napisałeś.
W każdym razie może tak

text.replaceAll("( pokój)+", " -");
3

sprawdź (pokój)(\s+(pokój))*

0

hmm to chyba to czego szukam... :) a jak bym chciał dołożyć jeszcze słowo "kuchnia" do tego?

0
biurostron napisał(a):

a jak bym chciał dołożyć jeszcze słowo "kuchnia" do tego?

W sensie?

EDIT: Może być trochę nadmiarowych nawiasów ((pokój)|(kuchnia))(\s+((pokój)|(kuchnia)))*

0

pokój lub kuchnia zamienia na "-"

1
KamilAdam napisał(a):
biurostron napisał(a):

a jak bym chciał dołożyć jeszcze słowo "kuchnia" do tego?

W sensie?

EDIT: Może być trochę nadmiarowych nawiasów ((pokój)|(kuchnia))(\s+((pokój)|(kuchnia)))*

Chyba raczej coś takiego (((pokój))(\s+((pokój)))*|((kuchnia))(\s+((kuchnia)))*) jeśli dobrze rozumiem cel.

EDIT do OP: A tak przy okazji używanie replaceAll ze Stringa jest często kiepskim pomysłem, bo przy każdym użyciu tam pod spodem jest kompilowany Pattern co jest dosyć kosztowne.

0

No właśnie OP dał tak mało informacji że nie wiadomo czy chce zamieniać kuchnia kuchnia kuchnia pokój pokój pokój na - czy na - - :D

2

Polskie znaki w UTF-8 należy wpisywać do javowych regexów jako kody a nie literały. Zapisanie tego w sposób bezpośredni spowoduje, że całe wyrażenie może nie zostać dopasowane.

0
pleome napisał(a):
KamilAdam napisał(a):
biurostron napisał(a):

a jak bym chciał dołożyć jeszcze słowo "kuchnia" do tego?

W sensie?

EDIT: Może być trochę nadmiarowych nawiasów ((pokój)|(kuchnia))(\s+((pokój)|(kuchnia)))*

Chyba raczej coś takiego (((pokój))(\s+((pokój)))*|((kuchnia))(\s+((kuchnia)))*) jeśli dobrze rozumiem cel.

EDIT do OP: A tak przy okazji używanie replaceAll ze Stringa jest często kiepskim pomysłem, bo przy każdym użyciu tam pod spodem jest kompilowany Pattern co jest dosyć kosztowne.

a jest coś szybszego i mniej kosztownego?

1
biurostron napisał(a):

a jest coś szybszego i mniej kosztownego?

Wystarczy spojrzeć do implementacji:

    public String replaceAll(String regex, String replacement) {
        return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }

Jeśli będziesz wykonywać ten sam regexp na wielu stringach to robisz coś w rodzaju:

val compiledPattern = Pattern.compile(regex);
streamOfStrings.map(s -> compiledPattern.matcher(s).replaceAll(replacement))
0
biurostron napisał(a):
pleome napisał(a):
KamilAdam napisał(a):
biurostron napisał(a):

a jak bym chciał dołożyć jeszcze słowo "kuchnia" do tego?

W sensie?

EDIT: Może być trochę nadmiarowych nawiasów ((pokój)|(kuchnia))(\s+((pokój)|(kuchnia)))*

Chyba raczej coś takiego (((pokój))(\s+((pokój)))*|((kuchnia))(\s+((kuchnia)))*) jeśli dobrze rozumiem cel.

EDIT do OP: A tak przy okazji używanie replaceAll ze Stringa jest często kiepskim pomysłem, bo przy każdym użyciu tam pod spodem jest kompilowany Pattern co jest dosyć kosztowne.

a jest coś szybszego i mniej kosztownego?

Nie używać regex.

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