Reguläre Ausdrücke definieren Muster von Zeichenfolgen.
Reguläre Ausdrücke können zum Suchen, Bearbeiten oder Bearbeiten von Text verwendet werden.
Reguläre Ausdrücke sind nicht auf eine Sprache beschränkt, es gibt jedoch in jeder Sprache subtile Unterschiede.
Reguläre Ausdrücke in Java sind denen von Perl am ähnlichsten.
Das Paket java.util.regex enthält hauptsächlich die folgenden drei Klassen:
Musterklasse:
Das Musterobjekt ist eine kompilierte Darstellung eines regulären Ausdrucks. Die Musterklasse hat keinen öffentlichen Konstruktor. Um ein Pattern-Objekt zu erstellen, müssen Sie zunächst seine öffentliche statische Kompilierungsmethode aufrufen, die ein Pattern-Objekt zurückgibt. Diese Methode akzeptiert einen regulären Ausdruck als ersten Parameter.
Matcher-Klasse:
Das Matcher-Objekt ist eine Engine, die Eingabezeichenfolgen interpretiert und abgleicht. Wie die Pattern-Klasse verfügt auch Matcher über keinen öffentlichen Konstruktor. Sie müssen die Matcher-Methode des Pattern-Objekts aufrufen, um ein Matcher-Objekt zu erhalten.
PatternSyntaxException:
PatternSyntaxException ist eine nicht obligatorische Ausnahmeklasse, die einen Syntaxfehler in einem regulären Ausdrucksmuster darstellt.
Das Erfassen von Gruppen ist eine Möglichkeit, mehrere Zeichen als eine Einheit zu behandeln, die durch Gruppieren von Zeichen in Klammern entsteht.
Beispielsweise erstellt der reguläre Ausdruck (Hund) eine einzelne Gruppe mit „d“, „o“ und „g“.
Einfangende Gruppen werden nummeriert, indem ihre öffnenden Klammern von links nach rechts gezählt werden. Im Ausdruck ((A)(B(C))) gibt es beispielsweise vier solcher Gruppen:
((ABC)))
(A)
(B(C))
(C)
Sie können überprüfen, wie viele Gruppen ein Ausdruck hat, indem Sie die Methode „groupCount“ des Matcher-Objekts aufrufen. Die Methode „groupCount“ gibt einen int-Wert zurück, der angibt, dass das Matcher-Objekt derzeit über mehrere Erfassungsgruppen verfügt.
Es gibt auch eine spezielle Gruppe (Gruppe 0), die immer den gesamten Ausdruck darstellt. Die Gruppe ist nicht im Rückgabewert von groupCount enthalten.
Das folgende Beispiel zeigt, wie man eine Ziffernfolge aus einer bestimmten Zeichenfolge findet:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
öffentliche Klasse RegexMatches
{
public static void main( String args[] ){
// Durchsuche die Zeichenfolge gemäß dem angegebenen Muster String line = „Diese Bestellung wurde für QT3000 aufgegeben! OK?“;
String-Muster = "(.*)(\d+)(.*)";
//Pattern-Objekt erstellen Pattern r = Pattern.compile(pattern);
// Jetzt Matcher-Objekt erstellen 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) );
} anders {
System.out.println("NO MATCH");
}
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Gefundener Wert: Diese Bestellung wurde für QT3000 aufgegeben!
Gefundener Wert: Diese Bestellung wurde für QT300 aufgegeben
Gefundener Wert: 0
Charakter | veranschaulichen |
---|---|
| Markieren Sie das nächste Zeichen als Sonderzeichen, Text, Rückverweis oder oktales Escape-Zeichen. Beispielsweise entspricht „n“ dem Zeichen „n“. „n“ entspricht einem Zeilenumbruchzeichen. Die Sequenz „\“ entspricht „“ und „(“ entspricht „(“. |
^ | Entspricht dem Anfang der Eingabezeichenfolge. Wenn die Multiline- Eigenschaft des RegExp- Objekts festgelegt ist, stimmt ^ auch mit der Position nach „n“ oder „r“ überein. |
$ | Entspricht dem Ende der Eingabezeichenfolge. Wenn die Multiline- Eigenschaft des RegExp- Objekts festgelegt ist, stimmt $ auch mit der Position vor „n“ oder „r“ überein. |
* | Entspricht dem vorhergehenden Zeichen oder Unterausdruck nullmal oder mehrmals. Beispielsweise stimmt zo* mit „z“ und „zoo“ überein. * Entspricht {0,}. |
+ | Entspricht dem vorhergehenden Zeichen oder Unterausdruck einmal oder mehrmals. Beispielsweise stimmt „zo+“ mit „zo“ und „zoo“ überein, aber nicht mit „z“. + Entspricht {1,}. |
? | Entspricht dem vorhergehenden Zeichen oder Unterausdruck null oder einmal. Beispielsweise entspricht „do(es)?“ „do“ oder „do“ in „does“. ? Entspricht {0,1}. |
{ N } | n ist eine nicht negative ganze Zahl. Passt genau n- mal zusammen. Beispielsweise stimmt „o{2}“ nicht mit dem „o“ in „Bob“ überein, stimmt aber mit beiden „o“s in „food“ überein. |
{ N ,} | n ist eine nicht negative ganze Zahl. Passt mindestens n -mal zusammen. Beispielsweise stimmt „o{2,}“ nicht mit dem „o“ in „Bob“ überein, sondern mit allen o in „foooood“. „o{1,}“ ist äquivalent zu „o+“. „o{0,}“ ist äquivalent zu „o*“. |
{ n , m } | M und n sind nichtnegative ganze Zahlen, wobei n <= m ist. Übereinstimmung mindestens n -mal und höchstens m -mal. Beispielsweise entspricht „o{1,3}“ den ersten drei o in „fooooood“. „o{0,1}“ ist äquivalent zu „o?“. Hinweis: Zwischen Kommas und Zahlen können keine Leerzeichen eingefügt werden. |
? | Wenn dieses Zeichen unmittelbar auf ein anderes Qualifikationsmerkmal (*, +, ?, { n }, { n ,}, { n , m }) folgt, ist das Übereinstimmungsmuster „nicht gierig“. Das „non-greedy“-Muster entspricht der kürzestmöglichen Zeichenfolge, während das standardmäßige „greedy“-Muster der längstmöglichen Zeichenfolge entspricht. Beispielsweise stimmt „o+?“ in der Zeichenfolge „oooo“ nur mit einem einzelnen „o“ überein, während „o+“ mit allen „o“ übereinstimmt. |
. | Entspricht jedem einzelnen Zeichen außer „rn“. Um ein beliebiges Zeichen einschließlich „rn“ zu finden, verwenden Sie ein Muster wie „[sS]“. |
( Muster ) | Entspricht einem Muster und erfasst den passenden Unterausdruck. Erfasste Übereinstimmungen können mithilfe der Attribute $0…$9 aus der resultierenden Sammlung „Übereinstimmungen“ abgerufen werden. Um das Klammerzeichen ( ) anzupassen, verwenden Sie „(“ oder „)“. |
(?: Muster ) | Ein Unterausdruck, der mit dem Muster übereinstimmt, die Übereinstimmung jedoch nicht erfasst, d. h. es handelt sich um eine nicht erfassende Übereinstimmung, und die Übereinstimmung wird nicht zur späteren Verwendung gespeichert. Dies ist nützlich, wenn Sie Musterteile mit dem „oder“-Zeichen (|) kombinieren. Beispielsweise ist „industr(?:y|ies)“ ein wirtschaftlicherer Ausdruck als „industry|industries“. |
(?= Muster ) | Ein Unterausdruck, der eine Vorwärts-Lookahead-Suche durchführt, die mit einer Zeichenfolge am Anfang einer Zeichenfolge übereinstimmt, die mit dem Muster übereinstimmt. Es handelt sich um einen nicht erfassenden Treffer, d. h. einen Treffer, der nicht zur späteren Verwendung erfasst werden kann. Beispielsweise entspricht „Windows (?=95|98|NT|2000)“ „Windows“ in „Windows 2000“, aber nicht „Windows“ in „Windows 3.1“. Vorhersage-Lookaheads belegen keine Zeichen, d. h. nach einer Übereinstimmung wird die nächste Übereinstimmung unmittelbar nach der vorherigen Übereinstimmung gesucht, nicht nach den Zeichen, aus denen der Vorhersage-Lookahead besteht. |
(?! Muster ) | Ein Unterausdruck, der eine Rückwärts-Lookahead-Suche durchführt, die mit einer Suchzeichenfolge übereinstimmt, die nicht am Anfang einer Zeichenfolge steht, die mit dem Muster übereinstimmt. Es handelt sich um einen nicht erfassenden Treffer, d. h. einen Treffer, der nicht zur späteren Verwendung erfasst werden kann. Beispielsweise entspricht „Windows (?!95|98|NT|2000)“ „Windows“ in „Windows 3.1“, aber nicht „Windows“ in „Windows 2000“. Vorhersage-Lookaheads belegen keine Zeichen, d. h. nach einer Übereinstimmung wird die nächste Übereinstimmung unmittelbar nach der vorherigen Übereinstimmung gesucht, nicht nach den Zeichen, aus denen der Vorhersage-Lookahead besteht. |
x |. y | Passen Sie x oder y an . Beispielsweise entspricht „z|food“ „z“ oder „food“. '(z|f)ood' entspricht „zood“ oder „food“. |
[ xyz ] | Zeichensatz. Entspricht jedem in enthaltenen Zeichen. Beispielsweise entspricht „[abc]“ dem „a“ in „plain“. |
[^ xyz ] | Umgekehrter Zeichensatz. Entspricht allen nicht enthaltenen Zeichen. Beispielsweise stimmt „[^abc]“ mit „p“, „l“, „i“ und „n“ in „plain“ überein. |
[ az ] | Zeichenbereich. Entspricht jedem Zeichen innerhalb des angegebenen Bereichs. „[az]“ entspricht beispielsweise jedem Kleinbuchstaben im Bereich „a“ bis „z“. |
[^ az ] | Zeichen für umgekehrten Bereich. Entspricht jedem Zeichen, das nicht im angegebenen Bereich liegt. „[^az]“ entspricht beispielsweise jedem Zeichen, das nicht im Bereich „a“ bis „z“ liegt. |
B | Entspricht einer Wortgrenze, also der Position zwischen einem Wort und einem Leerzeichen. Beispielsweise entspricht „erb“ dem „er“ in „never“, aber nicht dem „er“ in „verb“. |
B | Nicht-Wortgrenzen-Matching. „erB“ entspricht dem „er“ in „verb“, aber nicht dem „er“ in „never“. |
c x | Entspricht dem durch x angegebenen Steuerzeichen. cM entspricht beispielsweise Control-M oder einem Wagenrücklaufzeichen. Der Wert von x muss zwischen AZ und az liegen. Ist dies nicht der Fall, wird angenommen, dass c das „c“-Zeichen selbst ist. |
D | Numerischer Zeichenabgleich. Entspricht [0-9]. |
D | Entspricht nicht numerischen Zeichen. Entspricht [^0-9]. |
F | Formularfeed-Übereinstimmungen. Entspricht x0c und cL. |
N | Newline-Matching. Entspricht x0a und cJ. |
R | Entspricht einem Wagenrücklaufzeichen. Entspricht x0d und cM. |
S | Entspricht allen Leerzeichen, einschließlich Leerzeichen, Tabulatoren, Formularfeeds usw. Entspricht [fnrtv]. |
S | Entspricht jedem Zeichen, das kein Leerzeichen ist. Entspricht [^fnrtv]. |
T | Tab-Übereinstimmung. Entspricht x09 und cI. |
v | Vertikaler Tab-Abgleich. Entspricht x0b und cK. |
w | Entspricht jedem Zeichentyp, einschließlich Unterstrich. Entspricht „[A-Za-z0-9_]“. |
W | Entspricht jedem Zeichen, das kein Wort ist. Entspricht „[^A-Za-z0-9_]“. |
x n | Entspricht n , wobei n ein hexadezimaler Escape-Code ist. Der hexadezimale Escape-Code muss genau zwei Ziffern lang sein. Beispielsweise entspricht „x41“ „A“. „x041“ entspricht „x04“&“1“. Erlauben Sie ASCII-Codes in regulären Ausdrücken. |
num | Entspricht num , wobei num eine positive ganze Zahl ist. Rückverweis auf Erfassungsübereinstimmung. „(.)1“ entspricht beispielsweise zwei aufeinanderfolgenden identischen Zeichen. |
N | Identifiziert einen oktalen Escape-Code oder eine Rückreferenz. Wenn vor n mindestens n erfassende Unterausdrücke stehen, dann ist n eine Rückreferenz. Wenn n andernfalls eine Oktalzahl (0-7) ist, dann ist n der Oktal-Escape-Code. |
nm | Identifiziert einen oktalen Escape-Code oder eine Rückreferenz. Wenn nm mindestens nm vorangestellt ist, die Unterausdrücke erfasst, dann ist nm eine Rückreferenz. Wenn nm mindestens n Captures vorangestellt sind, ist n eine Rückreferenz, gefolgt vom Zeichen m . Wenn keine der vorherigen Bedingungen zutrifft, stimmt nm mit dem Oktalwert nm überein, wobei n und m Oktalziffern (0-7) sind. |
nml | Wenn n eine Oktalzahl (0-3) und m und l Oktalzahlen (0-7) sind, stimmen Sie mit dem Oktal-Escape-Code nml überein. |
u n | Entspricht n , wobei n ein Unicode-Zeichen ist, das als vierstellige Hexadezimalzahl dargestellt wird. Beispielsweise entspricht u00A9 dem Copyright-Symbol (©). |
Die Indexmethode stellt nützliche Indexwerte bereit, die genau angeben, wo in der Eingabezeichenfolge die Übereinstimmung gefunden wird:
Seriennummer | Methoden und Anweisungen |
---|---|
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 des vorherigen Matching-Vorgangs 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 des vorherigen Vergleichsvorgangs erfasst wurde. |
Die Forschungsmethode untersucht die Eingabezeichenfolge und gibt einen booleschen Wert zurück, der angibt, ob das Muster gefunden wurde:
Seriennummer | Methoden und Anweisungen |
---|---|
1 | public boolean lookingAt() versucht, eine Eingabesequenz beginnend am Anfang des Bereichs diesem Muster zuzuordnen. |
2 | public boolean find() versucht, die nächste Teilsequenz der Eingabesequenz zu finden, die diesem Muster entspricht. |
3 | public boolean find(int start) Setzt diesen Matcher zurück und versucht dann, die nächste Teilsequenz der Eingabesequenz beginnend beim angegebenen Index zu finden, die diesem Muster entspricht. |
4 | public boolean matches() versucht, den gesamten Bereich mit dem Muster abzugleichen. |
Die Ersetzungsmethode ist eine Methode zum Ersetzen von Text in der Eingabezeichenfolge:
Seriennummer | Methoden und Anweisungen |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) implementiert nicht-terminale Additions- und Ersetzungsschritte. |
2 | public StringBuffer appendTail(StringBuffer sb) implementiert die Schritte zum Hinzufügen und Ersetzen des Terminals. |
3 | public String replaceAll(String replacement) Ersetzt jede Teilsequenz der Eingabesequenz, deren Muster mit der angegebenen Ersetzungszeichenfolge übereinstimmt. |
4 | public String replaceFirst(String replacement) Ersetzt die erste Teilsequenz der Eingabesequenz, deren Muster mit der angegebenen Ersetzungszeichenfolge übereinstimmt. |
5 | public static String quoteReplacement(String s) gibt den literalen Ersatzstring des angegebenen Strings zurück. Diese Methode gibt eine Zeichenfolge zurück, die genau wie eine Literalzeichenfolge funktioniert, die an die appendReplacement-Methode der Matcher-Klasse übergeben wird. |
Hier ist ein Beispiel für die Zählung der Häufigkeit des Worts „cat“ in einer Eingabezeichenfolge:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
öffentliche Klasse RegexMatches
{
private static final String REGEX = "\bcat\b";
privater statischer finaler String INPUT =
„Katze, Katze, Katze, Katze, Katze“;
public static void main( String args[] ){
Muster p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // Holen Sie sich das Matcher-Objekt int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Spiel Nummer 1
start(): 0
end(): 3
Match Nummer 2
start(): 4
end(): 7
Match Nummer 3
start(): 8
end(): 11
Match Nummer 4
start(): 19
end(): 22
Sie können sehen, dass in diesem Beispiel Wortgrenzen verwendet werden, um sicherzustellen, dass die Buchstaben „c“, „a“ und „t“ nicht nur eine Teilzeichenfolge eines längeren Wortes sind. Es liefert auch einige nützliche Informationen darüber, wo in der Eingabezeichenfolge die Übereinstimmung aufgetreten ist.
Die Startmethode gibt den Anfangsindex der Teilsequenz zurück, die von der angegebenen Gruppe während des vorherigen Übereinstimmungsvorgangs erfasst wurde, und die Endmethode fügt eins zum Index des letzten übereinstimmenden Zeichens hinzu.
Die Methoden „matches“ und „lookingAt“ werden beide verwendet, um zu versuchen, ein Eingabesequenzmuster abzugleichen. Der Unterschied zwischen ihnen besteht darin, dass für Übereinstimmungen die gesamte Sequenz übereinstimmen muss, während dies bei lookingAt nicht der Fall ist.
Diese beiden Methoden werden häufig am Anfang der Eingabezeichenfolge verwendet.
Zur Erläuterung dieser Funktion verwenden wir folgendes Beispiel:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
öffentliche Klasse RegexMatches
{
privater statischer finaler String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
privates statisches Mustermuster;
privater statischer Matcher-Matcher;
public static void main( String args[] ){
Muster = Muster.compile(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println("Aktueller REGEX ist: "+REGEX);
System.out.println("Aktueller INPUT ist: "+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Aktueller REGEX ist: foo
Aktueller INPUT ist: fooooooooooooooooo
lookingAt(): wahr
match(): false
Die Methoden „replaceFirst“ und „replaceAll“ werden verwendet, um Text zu ersetzen, der einem regulären Ausdruck entspricht. Der Unterschied besteht darin, dass „replaceFirst“ die erste Übereinstimmung ersetzt und „replaceAll“ alle Übereinstimmungen ersetzt.
Das folgende Beispiel erläutert diese Funktionalität:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
öffentliche Klasse RegexMatches
{
privater statischer String REGEX = „Hund“;
private static String INPUT = „Der Hund sagt Miau.“ +
„Alle Hunde sagen Miau.“;
privater statischer String REPLACE = "cat";
public static void main(String[] args) {
Muster p = Pattern.compile(REGEX);
//Erhalte ein Matcher-Objekt
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Die Katze sagt Miau. Alle Katzen sagen Miau.
Die Matcher-Klasse stellt außerdem die Methoden appendReplacement und appendTail zum Ersetzen von Text bereit:
Sehen Sie sich das folgende Beispiel an, um diese Funktionalität zu erläutern:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
öffentliche Klasse RegexMatches
{
privater statischer String REGEX = "a*b";
privater statischer String INPUT = "aabfooaabfooabfoob";
privater statischer String REPLACE = „-“;
public static void main(String[] args) {
Muster p = Pattern.compile(REGEX);
// Holen Sie sich das Matcher-Objekt Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
-foo-foo-foo-
PatternSyntaxException ist eine nicht erzwungene Ausnahmeklasse, die einen Syntaxfehler in einem regulären Ausdrucksmuster anzeigt.
Die Klasse „PatternSyntaxException“ stellt die folgenden Methoden bereit, mit denen wir erkennen können, welche Fehler aufgetreten sind.
Seriennummer | Methoden und Anweisungen |
---|---|
1 | public String getDescription() Ruft die Fehlerbeschreibung ab. |
2 | public int getIndex() erhält den falschen Index. |
3 | public String getPattern() erhält das falsche reguläre Ausdrucksmuster. |
4 | public String getMessage() gibt einen mehrzeiligen String zurück, der eine Beschreibung des Syntaxfehlers und seines Index, das reguläre Ausdrucksmuster des Fehlers und eine visuelle Anzeige des Fehlerindex im Muster enthält. |