Hinweise zur Verwendung regulärer Ausdrücke in Java

Verschiedene Hinweise zur Verwendung regulärer Ausdrücke in Java.

Methoden, die reguläre Ausdrücke in der String-Klasse verwenden

Es gibt verschiedene Methoden in "String", die reguläre Ausdrücke akzeptieren.

matches(String)

package sample.regexp;

public class Main {

    public static void main(String[] args) {
        String text = "abc123";

        System.out.println(text.matches("[a-z0-9]+"));
        System.out.println(text.matches("[a-z]+"));
    }
}

Ausführungsergebnis


true
false

--Überprüfen Sie, ob die Zeichenfolge ** genau ** mit dem angegebenen regulären Ausdruck übereinstimmt

replaceAll(String, String)

package sample.regexp;

public class Main {

    public static void main(String[] args) {
        String text = "abc123";

        System.out.println(text.replaceAll("[a-z]", "*"));
    }
}

Ausführungsergebnis


***123

Verwenden Sie die Gruppe, die der Ersatzzeichenfolge entspricht

package sample.regexp;

public class Main {

    public static void main(String[] args) {
        String text = "<<abc123>>";

        System.out.println(text.replaceAll("([a-z]+)([0-9]+)", "$0, $1, $2"));
    }
}

Ausführungsergebnis


<<abc123, abc, 123>>

replaceFirst(String, String)

package sample.regexp;

public class Main {

    public static void main(String[] args) {
        String text = "abc123";

        System.out.println(text.replaceFirst("[a-z]", "*"));
    }
}

Ausführungsergebnis


*bc123

split(String, int)

package sample.regexp;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        String text = "a1b2";
        
        for (int i=-1; i<5; i++) {
            String[] elements = text.split("[0-9]", i);
            System.out.println("limit=" + i + ",\telements=" + Arrays.toString(elements));
        }
    }
}

Ausführungsergebnis


limit=-1,	elements=[a, b, ]
limit=0,	elements=[a, b]
limit=1,	elements=[a1b2]
limit=2,	elements=[a, b2]
limit=3,	elements=[a, b, ]
limit=4,	elements=[a, b, ]

Wenn der Anfang infolge der Division leer wird, wird das Leerzeichen so wie es ist als Element des Arrays festgelegt.

package sample.regexp;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        String text = "0a1b2";
        
        String[] elements = text.split("[0-9]", 0);
        System.out.println(Arrays.toString(elements));
    }
}

Ausführungsergebnis


[, a, b]

split(String) Dies ist das gleiche Verhalten wie das Setzen des zweiten Arguments von "split (String, int)" auf "0".

Musterklasse

Unterschied zur String-Methode

Mit einigen Ausnahmen [^ 1] Methoden, die die kanonische Delegierung der Klasse "String" hinter den Kulissen an die Klasse "Pattern" verwenden. Wenn Sie beispielsweise die Implementierung der Methode replaceAll () überprüfen, sieht dies folgendermaßen aus:

String.replaceAll()


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

Diese "Pattern" -Klasse (und "Matcher") ist für die Verarbeitung regulärer Ausdrücke in Java zuständig.

Die Klasse "Pattern" interpretiert die von "compile ()" übergebene Zeichenfolge als regulären Ausdruck. Wenn der verwendete reguläre Ausdruck festgelegt ist, ist es effizienter, dieses compile () nur beim ersten Mal auszuführen und dann die Pattern-Instanz wiederzuverwenden. (Die Klasse "Pattern" ist unveränderlich, sodass sie auch beim Multithreading sicher wiederverwendet werden kann.)

Dieses compile () wird jedoch jedes Mal ausgeführt, wenn die Methode verwendet wird, die den regulären Ausdruck der String-Klasse verwendet. Wenn Sie die Methode "String" verwenden, um einen festen regulären Ausdruck immer wieder auszuführen, ist die Verarbeitungsgeschwindigkeit daher langsamer als bei Verwendung der Instanz "Pattern".

Beispiel für die Verwendung von Pattern


public class Hoge {
    //Verwenden Sie die kompilierte Pattern-Instanz erneut
    private static final Pattern HOGE_PATTERN = Pattern.compile("[0-9]+");

    public boolean test(String text) {
        return HOGE_PATTERN.matcher(text).matches(); //Die Bewegung ist Text.maches("[0-9]+")Gleich wie
    }
}

Grundlegende Verwendung

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("[0-9]+");
        
        Matcher abc = pattern.matcher("123abc");
        System.out.println(abc.matches());

        Matcher _123 = pattern.matcher("123");
        System.out.println(_123.matches());
    }
}

Ausführungsergebnis


false
true

Teilt

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("[a-z]+");

        String[] elements = pattern.split("123abc456def789ghi");
        System.out.println(Arrays.toString(elements));

        elements = pattern.split("123abc456def789ghi", -1);
        System.out.println(Arrays.toString(elements));
    }
}

Ausführungsergebnis


[123, 456, 789]
[123, 456, 789, ]

Matcher --Pattern ist eine Klasse, die reguläre Ausdrücke interpretiert, und Matcher führt die folgende Verarbeitung durch.

  1. Führen Sie eine Übereinstimmungsoperation durch
  2. Fragen Sie das Ergebnis der Übereinstimmungsoperation ab
  3. Wiederholen Sie gegebenenfalls die Schritte 1 und 2

Match-Operation

Es gibt drei Match-Operationen in "Matcher".

matches()

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        test("abc");
        test("abc123");
    }

    private static void test(String text) {
        Pattern pattern = Pattern.compile("[a-z]+");
        Matcher matcher = pattern.matcher(text);

        System.out.println("[text=" + text + "]");
        if (matcher.matches()) {
            System.out.println("matches = true");
            System.out.println("start = " + matcher.start());
            System.out.println("end = " + matcher.end());
            System.out.println("group = " + matcher.group());
        } else {
            System.out.println("matches = false");
        }
    }
}

Ausführungsergebnis


[text=abc]
matches = true
start = 0
end = 3
group = abc

[text=abc123]
matches = false

--matches () überprüft, ob die gesamte Eingabesequenz mit dem regulären Ausdruck übereinstimmt

lookingAt()

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        test("abc");
        test("123abc");
        test("ab12");
    }

    private static void test(String text) {
        Pattern pattern = Pattern.compile("[a-z]+");
        Matcher matcher = pattern.matcher(text);

        System.out.println("[text=" + text + "]");
        if (matcher.lookingAt()) {
            System.out.println("lookingAt = true");
            System.out.println("start = " + matcher.start());
            System.out.println("end = " + matcher.end());
            System.out.println("group = " + matcher.group());
        } else {
            System.out.println("lookingAt = false");
        }
    }
}

Ausführungsergebnis


[text=abc]
lookingAt = true
start = 0
end = 3
group = abc

[text=123abc]
lookingAt = false

[text=ab12]
lookingAt = true
start = 0
end = 2
group = ab

--lookingAt () überprüft, ob der reguläre Ausdruck mit dem Beginn der Eingabesequenz übereinstimmt --Wenn die Überprüfung zu Beginn des Spiels erfolgt, wird "true" zurückgegeben (das Ganze muss nicht übereinstimmen).

find()

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        test("abc");
        test("123abc456def789");
    }

    private static void test(String text) {
        Pattern pattern = Pattern.compile("[a-z]+");
        Matcher matcher = pattern.matcher(text);

        System.out.println("[text=" + text + "]");
        while (matcher.find()) {
            System.out.println("start = " + matcher.start());
            System.out.println("end = " + matcher.end());
            System.out.println("group = " + matcher.group());
        }
    }
}

Ausführungsergebnis


[text=abc]
start = 0
end = 3
group = abc

[text=123abc456def789]
start = 3
end = 6
group = abc

start = 9
end = 12
group = def

Ersatz

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("[a-z]+");
        Matcher matcher = pattern.matcher("abc123def");

        System.out.println("replaceAll = " + matcher.replaceAll("*"));
        System.out.println("replaceFirst = " + matcher.replaceFirst("*"));
    }
}

Ausführungsergebnis


replaceAll = *123*
replaceFirst = *123def

--Ersetzen Sie alle übereinstimmenden Teilzeichenfolgen durch "Matcher.replaceAll (String)" --Matcher.replaceFirst (String) ersetzt nur den ersten übereinstimmenden Teilstring

Gruppe

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("([a-z]+)([0-9]+)");
        Matcher matcher = pattern.matcher("abc123de45fg");

        int groupCount = matcher.groupCount();
        System.out.println("groupCount=" + groupCount);
        
        while (matcher.find()) {
            System.out.println("==========");
            String group = matcher.group();
            System.out.println("group=" + group);
            
            for (int i=0; i<=groupCount; i++) {
                String g = matcher.group(i);
                System.out.println("group(" + i + ")=" + g);
            }
        }
    }
}

Ausführungsergebnis


groupCount=2
==========
group=abc123
group(0)=abc123
group(1)=abc
group(2)=123
==========
group=de45
group(0)=de45
group(1)=de
group(2)=45

Geben Sie der Gruppe einen Namen

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("(?<alphabets>[a-z]+)(?<numbers>[0-9]+)");
        Matcher matcher = pattern.matcher("abc123de45fg");
        
        while (matcher.find()) {
            System.out.println("==========");
            System.out.println("group(alphabets)=" + matcher.group("alphabets"));
            System.out.println("group(numbers)=" + matcher.group("numbers"));
        }
    }
}

Ausführungsergebnis


==========
group(alphabets)=abc
group(numbers)=123
==========
group(alphabets)=de
group(numbers)=45

Gehen Sie wie folgt vor, um auf den Gruppennamen in der Ersatzzeichenfolge zu verweisen:

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("(?<alphabets>[a-z]+)(?<numbers>[0-9]+)");
        Matcher matcher = pattern.matcher("abc123def456");

        String replaced = matcher.replaceAll("${numbers}${alphabets}");
        System.out.println(replaced);
    }
}

Ausführungsergebnis


123abc456def

Flagge

--Wenn Sie eine "Pattern" -Instanz erstellen, können Sie anpassen, wie der reguläre Ausdruck mit dem ** -Flag ** interpretiert wird.

Kompilieren Sie mit Flags


Pattern pattern = Pattern.compile("[a-z]", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

CASE_INSENSITIVE (Groß- und Kleinschreibung wird nicht berücksichtigt)

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher("ABC");
        System.out.println(matcher.matches());
    }
}

Ausführungsergebnis


true

UNICODE_CASE (Unicode unterscheidet nicht zwischen Groß- und Kleinschreibung)

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("[a-zA-Z]+", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
        Matcher matcher = pattern.matcher("ABCabc");
        System.out.println(matcher.matches());
    }
}

Ausführungsergebnis


true

LITERAL (keine Metazeichen oder Escapezeichen für reguläre Ausdrücke verwenden)

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        Pattern pattern = Pattern.compile("[a-z]+", Pattern.LITERAL);
        
        Matcher matcher = pattern.matcher("abc");
        System.out.println(matcher.matches());
        
        matcher = pattern.matcher("[a-z]+");
        System.out.println(matcher.matches());
    }
}

Ausführungsergebnis


false
true

MULTILINE (verarbeitet mehrzeilige Zeichenfolgen)

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        test("[default]", () -> Pattern.compile("^[a-z]+$"));
        test("[MULTILINE]", () -> Pattern.compile("^[a-z]+$", Pattern.MULTILINE));
    }
    
    private static void test(String label, Supplier<Pattern> patternSupplier) {
        System.out.println(label);
        Pattern pattern = patternSupplier.get();

        String text = "abc\n"
                    + "def\n";

        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);
        }
    }
}

Ausführungsergebnis


[default]
[MULTILINE]
abc
def

KOMMENTARE (Ermöglicht das Schreiben von Kommentaren)

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        String regexp = "#Diese Zeile wird als Kommentar ignoriert\n"
                      + "  [a-z]+  ";
        Pattern pattern = Pattern.compile(regexp, Pattern.COMMENTS);

        Matcher matcher = pattern.matcher("abc");

        System.out.println(matcher.matches());
    }
}

Ausführungsergebnis


true

DOTALL (stellen Sie sicher, dass das Ende der Zeile mit . übereinstimmt)

package sample.regexp;

import org.openjdk.jmh.runner.RunnerException;

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

public class Main {

    public static void main(String[] args) throws RunnerException {
        test("[default1]", () -> Pattern.compile(".+"));
        test("[default2]", () -> Pattern.compile(".+$"));
        test("[DOTALL]", () -> Pattern.compile(".+", Pattern.DOTALL));
    }

    private static void test(String label, Supplier<Pattern> patternSupplier) {
        System.out.println(label);
        Pattern pattern = patternSupplier.get();

        String text = "abc\n"
                    + "def\n";

        Matcher matcher = pattern.matcher(text);

        if (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);
        }
    }
}

Ausführungsergebnis


[default1]
abc
[default2]
def
[DOTALL]
abc
def

Referenz

[^ 1]: Beispielsweise führt die Methode "split (String regexp)" eine geteilte Verarbeitung ohne Verwendung von "Pattern" durch, wenn "regexp" eine einfache Zeichenfolge ist, die keine Metazeichen regulärer Ausdrücke verwendet. Geht

Recommended Posts

Hinweise zur Verwendung regulärer Ausdrücke in Java
Wie verwende ich Klassen in Java?
Verwendung von Java-Lambda-Ausdrücken
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Hinweise zu regulären Ausdrücken
Hinweise zur Verwendung der einzelnen JUnit-Regeln
Hinweise zum Schreiben von Kommentaren auf Englisch
[Java] Verwendung von Map
Verwendung von Java Optional
Verwendung der Java-Klasse
Verwendung von Java Map
Verwendung von Java-Variablen
Verwendung der nicht standardmäßigen Java-Bibliothek in IntelliJ IDEA
[Java] Wie man Aufgaben regelmäßig ausführt
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
Verwendung von Ruby on Rails
Wie man JAVA in 7 Tagen lernt
Verwendung von Bio-Formaten unter Ubuntu 20.04
[Verarbeitung × Java] Verwendung von Variablen
Hinweise zur Signalsteuerung in Java
Verwendung von InjectorHolder in OpenAM
[JavaFX] [Java8] Verwendung von GridPane
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
So benennen Sie Variablen in Java
[Verarbeitung × Java] Verwendung von Arrays
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
So verketten Sie Zeichenfolgen mit Java
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
Aufrufen und Verwenden der API in Java (Spring Boot)
Verwendung des Java-Aufzählungstyps (Enum) in Mapper XML von MyBatis
So wechseln Sie Java in der OpenJDK-Ära auf dem Mac
So überprüfen Sie, ob Java auf einem Mac installiert ist
Ein Memorandum zur Verwendung von Eclipse
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Verwendung von Apache Derby unter Eclipse
[Java] Verwendung der File-Klasse
Verwendung des benannten Volumes in docker-compose.yml
Verwendung der Submit-Methode (Java Silver)
So führen Sie eine Basiskonvertierung in Java durch
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
So bedienen Sie automatisch einen in Java unter Windows erstellten Bildschirm
[Verarbeitung × Java] Verwendung der Schleife
Verwendung von Docker in VSCode DevContainer
So wechseln Sie Java-Versionen auf dem Mac
Verwendung von MySQL im Rails-Tutorial
So erzwingen Sie Codierungskonventionen in Java
Verwendung und Definition von Java-Klassen, Importieren
Einbetten von Janus Graph in Java