Java Academy · Oppitunti

Kuvioiden kääntäminen

Pattern.compile ja Matcher.

Oppitunti 1/413 vaihetta

Kuvioiden kääntäminen on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Patternin ja Matcherin pari

Javan säännölliset lausekkeet sijaitsevat paketissa java.util.regex. Pattern on käännetty säännöllinen lauseke, ja Matcher käyttää tätä kaavaa tiettyyn syötteeseen.

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("abc123");
        System.out.println(m.find());
    }
}

Käännä kerran, käytä uudelleen usein

Pattern.compile on suhteellisen kallis operaatio. Kääntäkää säännöllinen lauseke kerran ja käyttäkää sitä uudelleen useiden syötteiden kanssa sen sijaan, että kääntäisitte sen uudelleen silmukassa.

import java.util.regex.Pattern;

public class Main {
    static final Pattern DIGITS = Pattern.compile("\\d+");

    public static void main(String[] args) {
        System.out.println(DIGITS.matcher("a1").find());
        System.out.println(DIGITS.matcher("bb").find());
    }
}

Kenoviivojen suojaaminen Javassa

Regex-tunnisteet, kuten \d, tarvitsevat kenoviivan, mutta Java-merkkijonot käyttävät kenoviivaa myös escapetuksissa. Lähdekoodissa kirjoitetaan siis \\d, joka tarkoittaa regexiä \d.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern word = Pattern.compile("\\w+");
        System.out.println(word.matcher("hello").matches());
    }
}

Matcherin luominen

pattern.matcher(input) liittää kuvion syötemerkkijonoon ja palauttaa uuden Matcher-olion, joka seuraa sijaintia.

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("cat");
        Matcher m = p.matcher("the cat sat");
        System.out.println(m.find());
    }
}

Matcher-oliot ovat tilallisia

Matcher sisältää muuttuvaa tilaa (nykyinen sijainti ja viimeisin osuma). Luokaa kullekin syötteelle uusi matcher-olio älkääkä jakako samaa oliota säikeiden kesken.

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d");
        Matcher m = p.matcher("a1b2");
        System.out.println(m.find());
        System.out.println(m.find());
    }
}

Kirjainkoon ohittava lippu

Välittäkää liput compile-metodin toisena argumenttina. Pattern.CASE_INSENSITIVE ohittaa kirjainkoon.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
        System.out.println(p.matcher("I love JAVA").find());
    }
}

Lippujen yhdistäminen

Yhdistäkää liput bittikohtaisella TAI-operaattorilla. Tässä lisätään MULTILINE, jotta ankkurit vastaavat jokaisen rivin kohdalla.

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^a", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
        Matcher m = p.matcher("apple\nApricot");
        int count = 0;
        while (m.find()) count++;
        System.out.println(count);
    }
}

Staattinen matches-oikotie

Pattern.matches(regex, input) on kertakäyttöinen apumetodi, joka kääntää kuvion ja testaa sen yhdellä kutsulla. Se on kätevä, mutta kääntää kuvion uudelleen joka kerta.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        System.out.println(Pattern.matches("\\d{3}", "123"));
        System.out.println(Pattern.matches("\\d{3}", "12"));
    }
}

Jakaminen Pattern-oliolla

Käännetyllä Pattern-oliolla voi jakaa merkkijonoja split-metodilla ja käyttää samaa käännettyä regexiä tehokkaasti uudelleen.

import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern comma = Pattern.compile("\\s*,\\s*");
        String[] parts = comma.split("a, b ,c,  d");
        System.out.println(Arrays.toString(parts));
    }
}

Kuvion tarkasteleminen

pattern() palauttaa alkuperäisen regex-merkkijonon ja flags() palauttaa käytössä olevat liput kokonaislukuna.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
        System.out.println(p.pattern());
        System.out.println(p.flags());
    }
}

Virheelliset kuviot aiheuttavat poikkeuksen

Virheellinen regex aiheuttaa PatternSyntaxException-poikkeuksen compile-kutsun aikana, joten virheet voidaan havaita aikaisessa vaiheessa.

import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class Main {
    public static void main(String[] args) {
        try {
            Pattern.compile("[unclosed");
        } catch (PatternSyntaxException e) {
            System.out.println("Invalid regex");
        }
    }
}

Pikatarkistus

Miksi usein käytetty regex kannattaa kääntää staattiseksi Pattern-kentäksi?

Kertaus

Käänsitte kuvioita:

  • Pattern.compile luo uudelleenkäytettävän, muuttumattoman ja säieturvallisen kuvion; matcher liittää sen syötteeseen.
  • Regexin kenoviivat suojataan Java-lähdekoodissa muodossa \\.
  • Liput, kuten CASE_INSENSITIVE ja MULTILINE, yhdistetään bittikohtaisella TAI-operaattorilla.
  • Matcher on tilallinen, joten kullekin syötteelle luodaan oma olio.
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Kuvioiden kääntäminen” ilmainen?

Kyllä – oppitunnin ”Kuvioiden kääntäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Kuvioiden kääntäminen”?

Pattern.compile ja Matcher. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Kuvioiden kääntäminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Kuvioiden kääntäminen
  2. Etsiminen ja sovittaminen
  3. Sieppausryhmät
  4. Korvaaminen säännöllisillä lausekkeilla
← Takaisin: Java Academy