Reguläre Ausdrücke in Java

Reguläre Ausdrücke definieren Muster für Zeichenfolgen.

Reguläre Ausdrücke können zum Suchen, Bearbeiten oder Verarbeiten von Text verwendet werden.

Reguläre Ausdrücke sind nicht auf eine bestimmte Sprache beschränkt, aber in jeder Sprache gibt es feine Unterschiede.

Java stellt das Paket java.util.regex bereit, das die Klassen Pattern und Matcher für die Behandlung von Abgleichoperationen mit regulären Ausdrücken enthält.

Beispiele für reguläre Ausdrücke

Eine Zeichenfolge ist ein einfacher regulärer Ausdruck. Zum Beispiel:Hello WorldDer reguläre Ausdruck stimmt mit der Zeichenfolge "Hello World" überein.

.(Punkt) ist ebenfalls ein regulärer Ausdruck. Er stimmt mit jedem einzelnen Zeichen überein, wie z. B. "a" oder "1".

Die folgende Tabelle listet einige Beispiele für reguläre Ausdrücke und Beschreibungen auf:

Regulärer Ausdruck Beschreibung

this is text

Entspricht der Zeichenkette "this is text"

this\s+is\s+text

Beachten Sie die ... in der Zeichenkette\s+。

Entspricht dem ... nach dem Wort "this"\s+Es kann mehrere Leerzeichen abgleichen, dann die is-Zeichenkette abgleichen, und dann\s+mehrere Leerzeichen abgleichen und dann mit der text-Zeichenkette fortfahren.

Es kann dieses Beispiel abgleichen: this is text

^\d+(\.\d+)?

^ definiert den Anfang

\d+ entspricht einer oder mehreren Ziffern

? macht die Option innerhalb der Klammern optional

\. entspricht "."

Beispiele, die abgeglichen werden können: "5", "1.5" und "2.21".

Weitere Inhalte zu regulären Ausdrücken finden Sie unter:Reguläre Ausdrücke - Tutorial


java.util.regex-Paket

java.util.regexDas Paket ist ein Paket in der Java-Standardbibliothek, das zur Unterstützung von Operationen mit regulären Ausdrücken verwendet wird.

Das Paket java.util.regex enthält hauptsächlich die folgenden drei Klassen:

  • Pattern-Klasse:

    Ein Pattern-Objekt ist eine kompilierte Darstellung eines regulären Ausdrucks. Die Pattern-Klasse hat keinen öffentlichen Konstruktor. Um ein Pattern-Objekt zu erstellen, müssen Sie zuerst ihre öffentliche statische compile-Methode aufrufen, die ein Pattern-Objekt zurückgibt. Diese Methode akzeptiert einen regulären Ausdruck als erstes Argument.

  • Matcher-Klasse:

    Ein Matcher-Objekt ist die Engine, die Übereinstimmungsoperationen auf einer Eingabezeichenfolge interpretiert und ausführt. Wie die Pattern-Klasse hat auch Matcher keinen öffentlichen Konstruktor. Sie müssen die matcher-Methode eines Pattern-Objekts aufrufen, um ein Matcher-Objekt zu erhalten.

  • PatternSyntaxException:

    PatternSyntaxException ist eine ungeprüfte Ausnahmeklasse, die einen Syntaxfehler in einem Muster für reguläre Ausdrücke anzeigt.

Das folgende Beispiel verwendet einen regulären Ausdruck.*example.*, um herauszufinden, ob die Zeichenfolgeexampleals Teilzeichenfolge enthält:

Beispiel

import java.util.regex.*; class RegexExample1{ public static void main(String[] args){ String content = "Ich bin ein Noob " + "von example.com."; String pattern = ".*example.*"; boolean isMatch = Pattern.matches(pattern, content); System.out.println("Enthält die Zeichenfolge die Teilzeichenfolge 'example'?" + isMatch); } }

Die Beispielausgabe ist:

Enthält die Zeichenfolge die Teilzeichenfolge 'example'? true

Erfassungsgruppen

Erfassungsgruppen sind eine Möglichkeit, mehrere Zeichen als eine einzelne Einheit zu behandeln. Sie werden erstellt, indem die Zeichen in Klammern gruppiert werden.

Zum Beispiel erzeugt der reguläre Ausdruck (dog) eine einzelne Gruppe, die "d", "o" und "g" enthält.

Erfassungsgruppen werden nummeriert, indem ihre öffnenden Klammern von links nach rechts gezählt werden. Zum Beispiel gibt es im Ausdruck ((A)(B(C))) vier solcher Gruppen:

  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (C)

Sie können die Methode groupCount eines Matcher-Objekts verwenden, um zu sehen, wie viele Gruppen der Ausdruck hat. Die Methode groupCount gibt einen int-Wert zurück, der angibt, wie viele Erfassungsgruppen das Matcher-Objekt derzeit hat.

Es gibt auch eine spezielle Gruppe (group(0)), die immer den gesamten Ausdruck darstellt. Diese Gruppe ist nicht im Rückgabewert von groupCount enthalten.

Beispiel

Das folgende Beispiel veranschaulicht, wie Ziffernfolgen aus einer gegebenen Zeichenkette gefunden werden:

Code der Datei RegexMatches.java:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String[] args ){ //Finde im String nach dem angegebenen Muster String line = "Diese Bestellung wurde für QT3000 aufgegeben! OK?"; String pattern = "(\\D*)(\\d+)(.*)"; //Erstelle ein Pattern-Objekt Pattern r = Pattern.compile(pattern); //Erstelle jetzt ein Matcher-Objekt Matcher m = r.matcher(line); if (m.find( )) { System.out.println("Gefundener Wert: " + m.group(0) ); System.out.println("Gefundener Wert: " + m.group(1) ); System.out.println("Gefundener Wert: " + m.group(2) ); System.out.println("Gefundener Wert: " + m.group(3) ); } else { System.out.println("KEIN TREFFER"); } } }

Das obige Beispiel wird kompiliert und ausgeführt und liefert das folgende Ergebnis:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT
Found value: 3000
Found value: ! OK?

Syntax für reguläre Ausdrücke

In anderen Sprachen,\\bedeutet es:Ich möchte einen normalen (wörtlichen) Backslash in den regulären Ausdruck einfügen; bitte geben Sie ihm keine besondere Bedeutung.

In Java,\\bedeutet es:Ich möchte einen Backslash für reguläre Ausdrücke einfügen, sodass das darauf folgende Zeichen eine besondere Bedeutung hat.

Daher reicht in anderen Sprachen (wie Perl) ein einzelner Backslash\aus, um eine Escape-Wirkung zu erzielen, während in Java-Regulärausdrücken zwei Backslashes benötigt werden, um als die Escape-Wirkung in anderen Sprachen geparst zu werden. Es kann auch einfach so verstanden werden, dass in Java-Regulärausdrücken zwei\\repräsentieren eins in anderen Sprachen\, weshalb der reguläre Ausdruck für eine einzelne Ziffer\\dist, und ein normaler Backslash wird durch\\。

System.out.print("\\");    // 输出为 \
System.out.print("\\\\");  // 输出为 \\

Zeichen

Beschreibung

\

Kennzeichnet das nächste Zeichen als Sonderzeichen, ein Literal, eine Rückreferenz oder einen Oktal-Escape. Zum Beispielnentspricht dem Zeichenn。\nentspricht einem Zeilenumbruch. Die Sequenz\\\\entspricht\\ ,\\(entspricht(。

^

Entspricht der Position am Anfang der Eingabezeichenfolge. Wenn dieRegExp-ObjektsMultiline-Eigenschaft gesetzt ist, entspricht ^ auch der Position nach "\n" oder "\r".

$

Entspricht der Position am Ende der Eingabezeichenfolge. Wenn dasRegExp-Objekt die EigenschaftMultilinegesetzt hat, stimmt $ auch mit der Position vor "\n" oder "\r" überein.

*

Entspricht dem vorhergehenden Zeichen oder Unterausdruck null oder mehr Mal. Zum Beispiel stimmt zo* mit "z" und "zoo" überein. * ist äquivalent zu {0,}.

+

Entspricht dem vorhergehenden Zeichen oder Unterausdruck ein oder mehr Mal. Zum Beispiel stimmt "zo+" mit "zo" und "zoo" überein, stimmt aber nicht mit "z" überein. + ist äquivalent zu {1,}.

?

Entspricht dem vorhergehenden Zeichen oder Unterausdruck null oder ein Mal. Zum Beispiel stimmt "do(es)?" mit "do" oder dem "do" in "does" überein. ? ist äquivalent zu {0,1}.

{n}

n ist eine nichtnegative ganze Zahl. Entspricht genaunMal. Zum Beispiel stimmt "o{2}" nicht mit dem "o" in "Bob" überein, stimmt aber mit den beiden "o" in "food" überein.

{n,}

n ist eine nichtnegative ganze Zahl. Entspricht mindestensn Mal. Zum Beispiel stimmt "o{2,}" nicht mit dem "o" in "Bob" überein, stimmt aber mit allen o's in "foooood" überein. "o{1,}" ist äquivalent zu "o+". "o{0,}" ist äquivalent zu "o*".

{n,m}

mundnist eine nichtnegative ganze Zahl, wobein <= m. Entspricht mindestensnMal, höchstensmMal. Zum Beispiel stimmt "o{1,3}" mit den ersten drei o's in "fooooood" überein. 'o{0,1}' ist äquivalent zu 'o?'. Hinweis: Zwischen dem Komma und den Ziffern dürfen keine Leerzeichen eingefügt werden.

?

Wenn dieses Zeichen unmittelbar auf einen anderen Quantifizierer (*, +, ?, {n}、{n,}、{n,m}) folgt, ist der Übereinstimmungsmodus "nicht gierig". Ein "nicht gieriger" Modus stimmt mit der kürzestmöglichen Zeichenfolge überein, die gesucht wird, während der standardmäßige "gierige" Modus mit der längstmöglichen Zeichenfolge übereinstimmt, die gesucht wird. Zum Beispiel stimmt in der Zeichenfolge "oooo" "o+?" nur mit einem einzelnen "o" überein, während "o+" mit allen "o" übereinstimmt.

.

Entspricht jedem einzelnen Zeichen außer "\r\n". Um mit jedem Zeichen einschließlich "\r\n" übereinzustimmen, verwenden Sie ein Muster wie "[\s\S]".

(pattern)

Stimmt mitMusterüberein und erfasst den übereinstimmenden Unterausdruck. Sie können$0…$9die Eigenschaft verwenden, um die erfasste Übereinstimmung aus der resultierenden "match"-Auflistung abzurufen. Um mit dem Klammerzeichen ( ) übereinzustimmen, verwenden Sie "\(" oder "\)".

(?:pattern)

EntsprichtMuster, aber ein Teilausdruck, der die Übereinstimmung nicht erfasst, d. h. es ist eine nicht erfassende Übereinstimmung und speichert die Übereinstimmung nicht für die spätere Verwendung. Dies ist nützlich, wenn Musterelemente mit dem Zeichen "oder" (|) kombiniert werden. Zum Beispiel ist 'industr(?:y|ies)' ein sparsamerer Ausdruck als 'industry|industries'.

(?=pattern)

Ein Teilausdruck, der eine positive Lookahead-Suche ausführt, dieMustermit der Zeichenkette am Startpunkt der übereinstimmenden Zeichenkette abgleicht. Es ist eine nicht erfassende Übereinstimmung, d. h., sie kann die Übereinstimmung nicht für die spätere Verwendung erfassen. Zum Beispiel entspricht 'Windows (?=95|98|NT|2000)' "Windows" in "Windows 2000", entspricht aber nicht "Windows" in "Windows 3.1". Lookahead verbraucht keine Zeichen; das heißt, nachdem eine Übereinstimmung aufgetreten ist, beginnt die Suche nach der nächsten Übereinstimmung unmittelbar nach der vorherigen Übereinstimmung, nicht nach den Zeichen, die den Lookahead bilden.

(?!pattern)

Ein Teilausdruck, der eine negative Lookahead-Suche ausführt, die eine Zeichenkette findet, die nicht am Startpunkt einer mitMusterübereinstimmenden Suchzeichenkette liegt. Es ist eine nicht erfassende Übereinstimmung, d. h., sie kann die Übereinstimmung nicht für die spätere Verwendung erfassen. Zum Beispiel entspricht 'Windows (?!95|98|NT|2000)' "Windows" in "Windows 3.1", entspricht aber nicht "Windows" in "Windows 2000". Lookahead verbraucht keine Zeichen; das heißt, nachdem eine Übereinstimmung aufgetreten ist, beginnt die Suche nach der nächsten Übereinstimmung unmittelbar nach der vorherigen Übereinstimmung, nicht nach den Zeichen, die den Lookahead bilden.

x|y

Entsprichtxodery. Zum Beispiel entspricht 'z|food' "z" oder "food". '(z|f)ood' entspricht "zood" oder "food".

[xyz]

Zeichensatz. Entspricht jedem enthaltenen Zeichen. Zum Beispiel entspricht "[abc]" "a" in "plain".

[^xyz]

Negativer Zeichensatz. Entspricht jedem nicht enthaltenen Zeichen. Zum Beispiel entspricht "[^abc]" "p", "l", "i", "n" in "plain".

[a-z]

Zeichenbereich. Entspricht jedem Zeichen im angegebenen Bereich. Zum Beispiel entspricht "[a-z]" jedem Kleinbuchstaben im Bereich "a" bis "z".

[^a-z]

Negatives Bereichszeichen. Entspricht jedem Zeichen, das nicht im angegebenen Bereich liegt. Zum Beispiel entspricht "[^a-z]" jedem Zeichen, das nicht im Bereich "a" bis "z" liegt.

\b

Entspricht einer Wortgrenze, d. h. der Position zwischen einem Wort und einem Leerzeichen. Zum Beispiel entspricht "er\b" dem "er" in "never", aber nicht dem "er" in "verb".

\B

Übereinstimmung mit einer Nicht-Wortgrenze. "er\B" entspricht dem "er" in "verb", aber nicht dem "er" in "never".

\cx

Entsprichtxdem angegebenen Steuerzeichen. Zum Beispiel entspricht \cM Control-M oder dem Wagenrücklauf.xDer Wert muss zwischen A-Z oder a-z liegen. Wenn nicht, wird angenommen, dass c das Zeichen "c" selbst ist.

\d

Übereinstimmung mit einem Ziffernzeichen. Äquivalent zu [0-9].

\D

Übereinstimmung mit einem Nicht-Ziffernzeichen. Äquivalent zu [^0-9].

\f

Übereinstimmung mit einem Seitenvorschubzeichen. Äquivalent zu \x0c und \cL.

\n

Übereinstimmung mit einem Zeilenumbruchzeichen. Äquivalent zu \x0a und \cJ.

\r

Entspricht einem Wagenrücklauf. Äquivalent zu \x0d und \0.

\s

Entspricht jedem Leerraumzeichen, einschließlich Leerzeichen, Tabulator, Seitenvorschub usw. Äquivalent zu [ \f\n\r\t\v].

\S

Entspricht jedem Nicht-Leerraumzeichen. Äquivalent zu [^ \f\n\r\t\v].

\t

Übereinstimmung mit einem Tabulatorzeichen. Äquivalent zu \x09 und \cI.

\v

Übereinstimmung mit vertikalem Tabulatorzeichen. Entspricht \x0b und \cK.

\w

Stimmt mit einem beliebigen Wortzeichen überein, einschließlich Unterstrich. Entspricht "[A-Za-z0-9_]".

\W

Stimmt mit einem beliebigen Nicht-Wortzeichen überein. Entspricht "[^A-Za-z0-9_]".

\xn

Stimmt mitnüberein, wobei dasnein hexadezimaler Escape-Code ist. Der hexadezimale Escape-Code muss genau zwei Ziffern lang sein. Zum Beispiel stimmt "\x41" mit "A" überein. "\x041" ist äquivalent zu "\x04"&"1". ASCII-Codes sind in regulären Ausdrücken erlaubt.

\num

Stimmt mitnumüberein, wobei dasnumeine positive Ganzzahl ist. Eine Rückreferenz auf eine erfasste Übereinstimmung. Zum Beispiel stimmt "(.)\1" mit zwei aufeinanderfolgenden identischen Zeichen überein.

\n

Identifiziert einen oktalen Escape-Code oder eine Rückreferenz. Wenn \nvon mindestensnerfassenden Unterausdrücken vorausgegangen wird, dann istneine Rückreferenz. Andernfalls, wennneine Oktalziffer (0-7) ist, dann istnein oktaler Escape-Code.

\nm

Identifiziert einen oktalen Escape-Code oder einen Rückverweis. Wenn \nmvon mindestensnmerfassenden Unterausdrücken vorausgegangen wird, dannnmist ein Rückverweis. Wenn \nmvon mindestensnErfassungen vorausgegangen wird, dannnist ein Rückverweis, gefolgt von dem Zeichenm. Wenn keiner der vorhergehenden Fälle existiert, dann \nmentspricht dem Oktalwertnm, wobein undmeine Oktalziffer (0-7) ist.

\nml

Wennneine Oktalziffer (0-3) ist,mundlwenn sie eine Oktalziffer (0-7) ist, entspricht dem Oktal-Escape-Codenml。

\un

Entsprichtn, wobeinein Unicode-Zeichen ist, das durch eine vierstellige Hexadezimalzahl dargestellt wird. Zum Beispiel entspricht \u00A9 dem Copyright-Symbol (©).

Gemäß den Anforderungen der Java Language Specification werden Backslashes in Zeichenketten im Java-Quellcode als Unicode-Escapes oder andere Zeichen-Escapes interpretiert. Daher müssen in String-Literalen zwei Backslashes verwendet werden, um den regulären Ausdruck davor zu schützen, vom Java-Bytecode-Compiler interpretiert zu werden. Wenn beispielsweise das String-Literal "\b" als regulärer Ausdruck interpretiert wird, entspricht es einem einzelnen Backspace-Zeichen, während "\\b" einer Wortgrenze entspricht. Das String-Literal "\(hello\)" ist unzulässig und verursacht einen Compilezeitfehler; um die Zeichenkette (hello) zu treffen, muss das String-Literal "\\(hello\\)" verwendet werden.


Methoden der Matcher-Klasse

Indexmethoden

Indexmethoden liefern nützliche Indexwerte, die genau angeben, wo eine Übereinstimmung in der Eingabezeichenkette gefunden werden kann:

Nein. Methode und Beschreibung
1 public int start()
Gibt den Anfangsindex der vorherigen Übereinstimmung zurück.
2 public int start(int group)
Gibt den Anfangsindex der Teilsequenz zurück, die von der angegebenen Gruppe während der vorherigen Übereinstimmungsoperation erfasst wurde.
3 public int end()
Gibt den Offset nach dem letzten übereinstimmenden Zeichen zurück.
4 public int end(int group)
Gibt den Offset nach dem letzten Zeichen der Teilsequenz zurück, die von der angegebenen Gruppe während der vorherigen Übereinstimmungsoperation erfasst wurde.

Untersuchungsmethoden

Suchmethoden werden verwendet, um die Eingabezeichenfolge zu überprüfen und einen booleschen Wert zurückzugeben, der angibt, ob das Muster gefunden wurde:

Nein. Methode und Beschreibung
1 public boolean lookingAt()
Versucht, die Eingabesequenz ab dem Anfang des Bereichs mit dem Muster abzugleichen.
2 public boolean find()
Versucht, die nächste Teilsequenz der Eingabesequenz zu finden, die mit dem Muster übereinstimmt.
3 public boolean find(int start)
Setzt diesen Matcher zurück und versucht dann, die nächste Teilsequenz der Eingabesequenz zu finden, die mit dem Muster übereinstimmt, beginnend am angegebenen Index.
4 public boolean matches()
Versucht, den gesamten Bereich mit dem Muster abzugleichen.

Ersetzungsmethoden

Ersetzungsmethoden sind Methoden zum Ersetzen von Text in der Eingabezeichenfolge:

Nein. Methode und Beschreibung
1 public Matcher appendReplacement(StringBuffer sb, String replacement)
Implementiert einen nicht-terminalen Anhänge- und Ersetzungsschritt.
2 public StringBuffer appendTail(StringBuffer sb)
Implementiert einen terminalen Anhänge- und Ersetzungsschritt.
3 public String replaceAll(String replacement)
Ersetzt jede Teilfolge der Eingabesequenz, die dem Muster entspricht, durch die angegebene Ersetzungszeichenfolge.
4 public String replaceFirst(String replacement)
Ersetzt die erste Teilfolge der Eingabesequenz, die dem Muster entspricht, durch die angegebene Ersetzungszeichenfolge.
5 public static String quoteReplacement(String s)
Gibt die literale Ersetzungszeichenfolge für die angegebene Zeichenfolge zurück. Diese Methode gibt eine Zeichenfolge zurück, die so funktioniert, als wäre sie eine literale Zeichenfolge, die an die Methode appendReplacement der Klasse Matcher übergeben wurde.

start- und end-Methoden

Das Folgende ist ein Beispiel, das die Anzahl der Vorkommen des Wortes "cat" in der Eingabezeichenfolge zählt:

Code der Datei RegexMatches.java:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "\\bcat\\b"; private static final String INPUT = "cat cat cat cattie cat"; public static void main( String[] args ){ Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); //Matcher-Objekt abrufen int count = 0; while(m.find()) { count++; System.out.println("Treffer Nummer "+count); System.out.println("start(): "+m.start()); System.out.println("end(): "+m.end()); } } }

Das obige Beispiel wird kompiliert und ausgeführt und liefert das folgende Ergebnis:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

Man kann erkennen, dass dieses Beispiel Wortgrenzen verwendet, um sicherzustellen, dass die Buchstaben "c", "a", "t" nicht nur eine Teilzeichenkette eines längeren Wortes sind. Es liefert auch einige nützliche Informationen darüber, wo Übereinstimmungen in der Eingabezeichenkette auftreten.

Die Methode start gibt den Anfangsindex der Teilsequenz zurück, die von der angegebenen Gruppe während der vorherigen Übereinstimmungsoperation erfasst wurde, und die Methode end gibt den Index des letzten übereinstimmenden Zeichens plus 1 zurück.

Die Methoden matches und lookingAt

Sowohl die Methode matches als auch die Methode lookingAt werden verwendet, um zu versuchen, eine Eingabesequenz mit einem Muster abzugleichen. Der Unterschied besteht darin, dass matches erfordert, dass die gesamte Sequenz übereinstimmt, während lookingAt dies nicht tut.

Die Methode lookingAt erfordert nicht, dass die gesamte Zeichenkette übereinstimmt, aber sie erfordert eine Übereinstimmung ab dem ersten Zeichen.

Diese beiden Methoden werden oft am Anfang der Eingabezeichenkette verwendet.

Wir verwenden das folgende Beispiel, um diese Funktionalität zu erklären:

Code der Datei RegexMatches.java:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "foo"; private static final String INPUT = "fooooooooooooooooo"; private static final String INPUT2 = "ooooofoooooooooooo"; private static Pattern pattern; private static Matcher matcher; private static Matcher matcher2; public static void main( String[] args ){ pattern = Pattern.compile(REGEX); matcher = pattern.matcher(INPUT); matcher2 = pattern.matcher(INPUT2); System.out.println("Aktueller REGEX ist: "+REGEX); System.out.println("Aktuelle INPUT ist: "+INPUT); System.out.println("Aktuelle INPUT2 ist: "+INPUT2); System.out.println("lookingAt(): "+matcher.lookingAt()); System.out.println("matches(): "+matcher.matches()); System.out.println("lookingAt(): "+matcher2.lookingAt()); } }

Das obige Beispiel wird kompiliert und ausgeführt und liefert das folgende Ergebnis:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
Current INPUT2 is: ooooofoooooooooooo
lookingAt(): true
matches(): false
lookingAt(): false

replaceFirst- und replaceAll-Methoden

Die Methoden replaceFirst und replaceAll werden verwendet, um Text zu ersetzen, der dem regulären Ausdruck entspricht. Der Unterschied besteht darin, dass replaceFirst die erste Übereinstimmung ersetzt, während replaceAll alle Übereinstimmungen ersetzt.

Das folgende Beispiel erläutert diese Funktionalität:

Code der Datei RegexMatches.java:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "dog"; private static String INPUT = "The dog says meow. " + "All dogs say meow."; private static String REPLACE = "cat"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // ein Matcher-Objekt abrufen Matcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE); System.out.println(INPUT); } }

Das Ergebnis des Kompilierens und Ausführens des obigen Beispiels ist:

The cat says meow. All cats say meow.

appendReplacement- und appendTail-Methoden

Die Matcher-Klasse bietet auch die appendReplacement- und appendTail-Methoden für die Textersetzung:

Siehe das folgende Beispiel zur Erläuterung dieser Funktionalität:

Code der Datei RegexMatches.java:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "a*b"; private static String INPUT = "aabfooaabfooabfoobkkk"; private static String REPLACE = "-"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); //Matcher-Objekt abrufen Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()){ m.appendReplacement(sb,REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } }

Das Ergebnis des Kompilierens und Ausführens des obigen Beispiels ist:

-foo-foo-foo-kkk

Methoden der Klasse PatternSyntaxException

PatternSyntaxException ist eine nicht geprüfte Ausnahmeklasse, die einen Syntaxfehler in einem Muster für reguläre Ausdrücke anzeigt.

Die Klasse PatternSyntaxException bietet die folgenden Methoden, mit denen wir sehen können, welcher Fehler aufgetreten ist.

Nein. Methode und Beschreibung
1 public String getDescription()
Ruft die Beschreibung des Fehlers ab.
2 public int getIndex()
Ruft den Index des Fehlers ab.
3 public String getPattern()
Ruft das fehlerhafte Muster für reguläre Ausdrücke ab.
4 public String getMessage()
Gibt eine mehrzeilige Zeichenfolge zurück, die die Beschreibung des Syntaxfehlers und seinen Index, das fehlerhafte reguläre Ausdrucksmuster und eine visuelle Angabe des Fehlerindexes im Muster enthält.
Weitere Erweiterungen