JavaRush /Java-Blog /Random-DE /Reguläre Ausdrücke in Java, Teil 4

Reguläre Ausdrücke in Java, Teil 4

Veröffentlicht in der Gruppe Random-DE
Wir präsentieren Ihnen eine Übersetzung einer kurzen Anleitung zu regulären Ausdrücken in Java, die Jeff Friesen für die Javaworld- Website geschrieben hat . Zur besseren Lesbarkeit haben wir den Artikel in mehrere Teile gegliedert. Reguläre Ausdrücke in Java, Teil 4 - 1 Reguläre Ausdrücke in Java, Teil 1 Reguläre Ausdrücke in Java, Teil 2 Reguläre Ausdrücke in Java, Teil 3

Methoden zum Arbeiten mit erfassten Gruppen

Der Quellcode der Anwendung RegexDemoenthält einen Methodenaufruf m.group(). Die Methode group()ist eine von mehreren Methoden der Klasse Matcher, die auf die Arbeit mit erfassten Gruppen abzielen:
  • Die Methode int groupCount()gibt die Anzahl der erfassten Gruppen im Resolvermuster zurück. Diese Nummer berücksichtigt nicht die spezielle Capture-Gruppennummer 0, die dem Muster als Ganzes entspricht.

  • Die Methode String group()gibt die Zeichen der zuvor gefundenen Übereinstimmung zurück. Um eine erfolgreiche Suche nach einer leeren Zeichenfolge zu melden, gibt diese Methode eine leere Zeichenfolge zurück. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

  • Die Methode String group(int group)ähnelt der vorherigen Methode, außer dass sie die Zeichen der zuvor gefundenen Übereinstimmung zurückgibt, erfasst durch die durch den Parameter angegebene Gruppennummer group. Beachten Sie, dass dies group(0)äquivalent ist group(). Wenn die Vorlage keine erfasste Gruppe mit der angegebenen Nummer enthält, löst die Methode eine Ausnahme aus IndexOutOfBoundsException. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

  • Die Methode String group(String name)gibt die Zeichen der zuvor gefundenen Übereinstimmung zurück, erfasst von der Namensgruppe. Wenn der erfasste Gruppenname nicht in der Vorlage enthalten ist, wird eine Ausnahme ausgelöst IllegalArgumentException. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

Das folgende Beispiel demonstriert die Verwendung der groupCount()und- Methoden group(int group):
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
Ausführungsergebnisse:
3
0: abc
1: abc
2: bc
3: c
Reguläre Ausdrücke in Java, Teil 4 - 2

Methoden zur Bestimmung von Spielpositionen

Die Klasse Matcherstellt mehrere Methoden bereit, die die Start- und Endpositionen einer Übereinstimmung zurückgeben:
  • Die Methode int start()gibt die Startposition der zuvor gefundenen Übereinstimmung zurück. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

  • Die Methode int start(int group)ähnelt der vorherigen Methode, gibt jedoch die Startposition der vorherigen Übereinstimmung zurück, die für die Gruppe gefunden wurde, deren Nummer durch den Parameter angegeben wird group. Wenn die Vorlage keine erfasste Gruppe mit der angegebenen Nummer enthält, löst die Methode eine Ausnahme aus IndexOutOfBoundsException. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

  • Die Methode int start(String name)ähnelt der vorherigen Methode, gibt jedoch die Startposition der vorherigen Übereinstimmung zurück, die für die Gruppe mit dem Namen gefunden wurde name. Wenn die erfasste Gruppe namenicht in der Vorlage enthalten ist, wird eine Ausnahme ausgelöst IllegalArgumentException. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

  • Die Methode int end()gibt die Position des letzten Zeichens der zuvor gefundenen Übereinstimmung plus 1 zurück. Wenn der Matcher noch keine Übereinstimmung durchgeführt hat oder der vorherige Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

  • Die Methode int end(int group)ähnelt der vorherigen Methode, gibt jedoch die Endposition der vorherigen Übereinstimmung zurück, die für die Gruppe gefunden wurde, deren Nummer durch den Parameter angegeben wird group. Wenn die Vorlage keine erfasste Gruppe mit der angegebenen Nummer enthält, löst die Methode eine Ausnahme aus IndexOutOfBoundsException. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

  • Die Methode int end(String name)ähnelt der vorherigen Methode, gibt jedoch die Endposition der vorherigen Übereinstimmung zurück, die für die Gruppe mit dem Namen gefunden wurde name. Wenn die erfasste Gruppe namenicht in der Vorlage enthalten ist, wird eine Ausnahme ausgelöst IllegalArgumentException. Wenn der Resolver noch keine Suche durchgeführt hat oder ein vorheriger Suchvorgang fehlgeschlagen ist, wird eine Ausnahme ausgelöst IllegalStateException.

Das folgende Beispiel zeigt zwei Match-Lokalisierungsmethoden, die die Start-/End-Match-Positionen für die Erfassungsgruppe Nummer 2 ausgeben:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
   System.out.println("Найдено " + m.group(2));
   System.out.println("  начинается с позиции " + m.start(2) +
                      " и заканчивается на позиции " + (m.end(2) - 1));
   System.out.println();
}
Die Ausgabe dieses Beispiels ist die folgende:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

Methoden der PatternSyntaxException-Klasse

Eine Instanz der Klasse PatternSyntaxExceptionbeschreibt einen Syntaxfehler im regulären Ausdruck. Löst eine solche Ausnahme von den Methoden compile()und matches()der Klasse Patternaus und wird durch den folgenden Konstruktor gebildet: PatternSyntaxException(String desc, String regex, int index) Dieser Konstruktor speichert die angegebene Beschreibung ( desc), den regulären Ausdruck ( regex) und die Position, an der der Syntaxfehler aufgetreten ist. Wenn der Ort des Syntaxfehlers unbekannt ist, indexwird der Wert auf gesetzt -1. Höchstwahrscheinlich müssen Sie nie Instanzen von erstellen PatternSyntaxException. Sie müssen jedoch die oben genannten Werte extrahieren, wenn Sie eine formatierte Fehlermeldung erstellen. Dazu können Sie die folgenden Methoden verwenden:
  • Die Methode String getDescription()gibt eine Beschreibung des Syntaxfehlers zurück.
  • Die Methode int getIndex()gibt entweder die Position zurück, an der der Fehler aufgetreten ist, oder -1, wenn die Position unbekannt ist.
  • Die Methode String getPattern()gibt einen ungültigen regulären Ausdruck zurück.
Darüber hinaus gibt die geerbte Methode String getMessage()eine mehrzeilige Zeichenfolge mit den von vorherigen Methoden zurückgegebenen Werten zurück, zusammen mit einem visuellen Hinweis darauf, wo in der Vorlage der Syntaxfehler aufgetreten ist. Was ist ein Syntaxfehler? Hier ist ein Beispiel: In diesem Fall haben wir vergessen, das schließende Klammer-Metazeichen ( ) im verschachtelten Flag-Ausdruck java RegexDemo (?itree Treehouse anzugeben . )Dies ist die Ausgabe dieses Fehlers:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Erstellen Sie nützliche Anwendungen für reguläre Ausdrücke mithilfe der Regex-API

Mit regulären Ausdrücken können Sie leistungsstarke Textverarbeitungsanwendungen erstellen. In diesem Abschnitt zeigen wir Ihnen zwei praktische Anwendungen, die Sie hoffentlich dazu ermutigen werden, die Regex-API-Klassen und -Methoden weiter zu erkunden. Der zweite Anhang stellt Lexan vor: eine wiederverwendbare Codebibliothek zur Durchführung lexikalischer Analysen. Reguläre Ausdrücke in Java, Teil 4 - 3

Reguläre Ausdrücke und Dokumentation

Die Dokumentation gehört zu den Pflichtaufgaben bei der Entwicklung professioneller Software. Glücklicherweise können Ihnen reguläre Ausdrücke bei vielen Aspekten der Dokumentationserstellung helfen. Der Code in Listing 1 extrahiert Zeilen mit einzeiligen und mehrzeiligen Kommentaren im C-Stil aus einer Quelldatei und schreibt sie in eine andere Datei. Damit der Code funktioniert, müssen sich die Kommentare in derselben Zeile befinden. Listing 1. Kommentare abrufen
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

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

public class ExtCmnt
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("Способ применения: java ExtCmnt infile outfile");
         return;
      }

      Pattern p;
      try
      {
         // Следующий шаблон определяет многострочные комментарии,
         // располагающиеся в одной строке (например, /* одна строка */)
            // и однострочные комментарии (например, // Wieая-то строка).
            // Комментарий может располагаться в любом месте строки.

         p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
      }
      catch (PatternSyntaxException pse)
      {
         System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
         System.err.printf("Описание ошибки: %s%n", pse.getDescription());
         System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
         System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
         return;
      }

      try (FileReader fr = new FileReader(args[0]);
           BufferedReader br = new BufferedReader(fr);
           FileWriter fw = new FileWriter(args[1]);
           BufferedWriter bw = new BufferedWriter(fw))
      {
         Matcher m = p.matcher("");
         String line;
         while ((line = br.readLine()) != null)
         {
            m.reset(line);
            if (m.matches()) /* Должна соответствовать вся строка */
            {
               bw.write(line);
               bw.newLine();
            }
         }
      }
      catch (IOException ioe)
      {
         System.err.println(ioe.getMessage());
         return;
      }
   }
}
Die Methode main()in Listing 1 prüft zunächst die korrekte Befehlszeilensyntax und kompiliert dann einen regulären Ausdruck, der ein- und mehrzeilige Kommentare erkennt, in ein Klassenobjekt Pattern. Wenn keine Ausnahme ausgelöst wird PatternSyntaxException, öffnet die Methode main()die Quelldatei, erstellt die Zieldatei, ruft einen Matcher ab, um jede gelesene Zeile mit dem Muster abzugleichen, und liest dann die Quelldatei Zeile für Zeile. Für jede Zeile wird ein Kommentarmuster zugeordnet. Bei Erfolg schreibt die Methode main()die Zeichenfolge (gefolgt von einer neuen Zeile) in die Zieldatei (wir werden die Datei-E/A-Logik in einem zukünftigen Java 101-Tutorial behandeln). Kompilieren Sie Listing 1 wie folgt: javac ExtCmnt.java Führen Sie die Anwendung mit Datei ExtCmnt.javaals Eingabe aus: java ExtCmnt ExtCmnt.java out Sie sollten die folgenden Ergebnisse in Dateiausgabe erhalten:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Wieая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
In der Musterzeichenfolge fungiert .*/\\*.*\\*/|.*//.*$das Pipe-Metazeichen |als logischer ODER-Operator und gibt an, dass der Matcher den linken Operanden des angegebenen regulären Ausdruckskonstrukts verwenden soll, um eine Übereinstimmung im Matcher-Text zu finden. Wenn es keine Übereinstimmungen gibt, verwendet der Matcher den richtigen Operanden aus dem angegebenen regulären Ausdruckskonstrukt für einen weiteren Suchversuch (die Klammermetazeichen in der erfassten Gruppe bilden auch einen logischen Operator). Reguläre Ausdrücke in Java, Teil 5
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION