Problem z regex

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

Mam drobny problem z regex'em
Mam taki string

Kopiuj
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 - ?

szweszwe
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1694
1

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

Kopiuj
text.replaceAll("( pokój)+", " -");
KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
3

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

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

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

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
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)))*

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

pokój lub kuchnia zamienia na "-"

PL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
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

PerlMonk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa 🐪
  • Postów: 1719
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.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
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?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
1
biurostron napisał(a):

a jest coś szybszego i mniej kosztownego?

Wystarczy spojrzeć do implementacji:

Kopiuj
    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:

Kopiuj
val compiledPattern = Pattern.compile(regex);
streamOfStrings.map(s -> compiledPattern.matcher(s).replaceAll(replacement))
PerlMonk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa 🐪
  • Postów: 1719
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.