• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

toUpperCase słów w cudzysłowie

0 głosów
599 wizyt
pytanie zadane 1 maja 2016 w Java przez mkl215 Początkujący (280 p.)
Hejka, mam pytanie.

Chcę napisać algorytm, który przyjmuje wartość typu String, w którym jest normalne zdanie z wyrazami w cudzysłowach a zwraca to samo zdanie z tą różnicą, że wyrazy w "cudzysłowach" są napisane "WIELKIMI" literami.

Znalazłem klasę stringTokenizer, jednak ona typowo dzieli wyrazy, znalazłem informacje o klasach Pattern i Macher jednak nie bardzo wiem jak to wszystko złożyć do kupy :/

Przykładowy String, który może posłużyć za przykład:

Spółki „PKP intercity” i „PKP przewozy regionalne” nie są zarządzane przez te same spółki.

Z góry dzięki za pomoc.

4 odpowiedzi

+1 głos
odpowiedź 2 maja 2016 przez Ceki Mądrala (5,310 p.)

Ja się na Klasie Pattern nie znam, ale zrobił bym to tak:

String funkcja(String napisWejsciowy)
    {
        String napisWyjsciowy = "";

        boolean wCudzyslowiu = false;

        for (int i = 0; i<napisWejsciowy.length(); i++)
        {
            if (napisWejsciowy.charAt(i) == '\"')
            {
                if (wCudzyslowiu == false)
                    wCudzyslowiu = true;
                else
                    wCudzyslowiu = false;

                napisWyjsciowy+="\"";

            }
            else
            {
                if(wCudzyslowiu==true)
                    napisWyjsciowy += Character.toUpperCase(napisWejsciowy.charAt(i));
                else
                napisWyjsciowy += napisWejsciowy.charAt(i);

            }


        }

        return napisWyjsciowy;
    }

;)

+1 głos
odpowiedź 2 maja 2016 przez xandros Nałogowiec (29,420 p.)

To mój pierwszy kontakt z javą:

    final String PATTERN = "(\"[^\"]*\")";
    
    public String quoteToUpperCase(String input) {
        Pattern pattern = Pattern.compile(this.PATTERN);
        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) {
            input = input.replace(matcher.group(1), matcher.group(1).toUpperCase());
        }
        return input;
    }

Pewnie jest jakiś regexreplacer z callbackiem.

PS łap narzędzie do testowania regexów: https://www.debuggex.com/

komentarz 4 maja 2016 przez mkl215 Początkujący (280 p.)
Dzięki wielki :) odpuściłem jednak tego Patterna i Matchera :P

Dla zainteresowanych polecam klasę StringTokenizer, w konstruktorze podaje się (plik lub napis w Stringu, "znaki jakie są tokenami", boolean)
plik lub String nie muszę tłumaczyć, "znaki" <- podaje się w jednym cudzysłowie i klasa automatycznie wyciąga każdy znak podany wewnątrz np. " ,;" <- tokanemi są spacja, przecinek i średnik, boolean <- podaje się czy będzie brany pod uwagę czy po prostu "omijany", jeśli brany pod uwagę to będzie go łapał i będzie można z nim zrobić WSZYSTKO w sumie, zależy od programisty :) Jeśli dacie "/"" to będzie to cudzysłów i z odpowiednią metodą jak hasNextElement() albo hasNextToken() sprawdza czy jest kolejny token w napisie - przydatne do pętli, metoda nextToken() pobiera wszystko do następnego (albo następny jeśli jest true) tokena. Generalnie fajna zabawka :) Dzięki za pomoc ! i Za program :)
0 głosów
odpowiedź 1 maja 2016 przez Ceki Mądrala (5,310 p.)
Jak chcesz w javie zrobić cudzysłów w stringu to zamiast pisać " musisz napisać \" . Mam nadzieję, że trochę pomogłem ;) .
komentarz 1 maja 2016 przez mkl215 Początkujący (280 p.)

Nie bardzo o to mi chodziło :) To wiem :)

Mam zdanie:

Spółki „PKP intercity” i „PKP przewozy regionalne” nie są zarządzane przez te same spółki.

A chcę utworzyć takie zdanie:

Spółki „PKP INTERCITY” i „PKP PRZEWOZY REGIONALNE” nie są zarządzane przez te same spółki.

komentarz 2 maja 2016 przez Ceki Mądrala (5,310 p.)
Ok dzięki za naprowadzenie ;)
0 głosów
odpowiedź 1 maja 2016 przez mkl215 Początkujący (280 p.)
edycja 1 maja 2016 przez mkl215

Generalnie muszę "wydobyć" jakoś słowo / słowa z cudzysłowów, wykonać na nich metodę toUpperCase() i znowu skleić wszystko w całość, tylko że się już gubię...

Mam coś takiego, w sumie działa, ale nie wiem jak skleić na nowo zachowując odpowiednią składnię:

Pattern pattern = Pattern.compile(".*\"(.*)\".*");
Matcher matcher = pattern.matcher("Spółki \"PKP Intercity\" i \"PKP Przewozy Regionalne\" nie są zarządzane przez te same spółki.");
while(matcher.find())
{
    System.out.println(matcher.group(1).toUpperCase());
}

Mimo, że jest to w pętli to na konsolę wypisuje mi jedynie:
PKP PRZEWOZY REGIONALNE

To nie będzie jedyne zdanie, różna ilość cudzysłowów będzie w zdaniach, generalnie to ma być uniwersalny algorytm przyjmujący zmienną typu String, a nie jest powiedziane czy będzie tylko jeden cudzysłów w Stringu czy 10 czy żaden... Help?

komentarz 2 maja 2016 przez adrian17 Mentor (355,240 p.)
Bo tak napisałeś tego regexa.

http://i.imgur.com/dxlPv7r.png
komentarz 2 maja 2016 przez adrian17 Mentor (355,240 p.)
komentarz 2 maja 2016 przez mkl215 Początkujący (280 p.)

Co to to co tam masz? :O

Wiem, że tak napisałem, ale cała sztuka ma polegać na tym, że to ma być metoda

public static String nazwa(String lancuch) return nowyLancuch;

Takie wiesz... Wielorazowego użytku :) ale w różnych kombinacjach, jakiś pomysł jak to bardziej 'zautomatyzować' ?

Podobne pytania

0 głosów
1 odpowiedź 756 wizyt
pytanie zadane 11 grudnia 2022 w C i C++ przez polandonion Dyskutant (7,730 p.)
+1 głos
1 odpowiedź 707 wizyt
0 głosów
3 odpowiedzi 1,381 wizyt
pytanie zadane 24 stycznia 2020 w C i C++ przez Agnes Użytkownik (990 p.)

93,788 zapytań

142,753 odpowiedzi

323,429 komentarzy

63,393 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...