Filter mit regulären Ausdrücken

Diese Seite beschreibt, wie man Filter in der Syntax regulärer Ausdrücke schreibt. i-net PDFC verwendet die Java-Implementierung regulärer Ausdrücke, eine vollständige Spezifikation der Syntax finden Sie daher in der Java Pattern Documentation.

i-net PDFC spezifische Implementierung

i-net PDFC hat neben den normalen Regeln für reguläre Ausdrücke einige spezielle Regeln für den Mustervergleich:

  • ein Wort wird beim Vergleich ignoriert, wenn mindestens ein Zeichen des Wortes mit einem beliebigen Muster übereinstimmt (Sie können jedoch ein Leerzeichen am Ende oder Anfang übereinstimmen lassen, um das ganze Wort zu finden)
  • Falls verwendet, sind Mustergruppen standardmäßig ausschließend - Einzelheiten finden Sie im Abschnitt Mustergruppen.
  • Muster sind standardmäßig Case-Sensitiv.
  • Der Operator . passt nicht auf einen Zeilenumbruch.

Entwickeln eines Musters

Um ein Muster von Grund auf neu zu definieren, beginnen Sie einfach mit einem Beispiel für die Textsequenz, auf die der Filter abgestimmt werden soll. Stellen Sie sich vor, Sie möchten ein "zuletzt geändertes" Datum aus dem Vergleich ausschließen. Ihr erster Schritt könnte sein, mit einem Datum als Filtermuster zu beginnen:

24/12/2013

Das würde aber nur auf ein Datum passen. Um auch andere Datumsangaben zuzulassen, ersetzen Sie alle Teile, die mehr als einen Wert haben können, durch einen allgemeineren Ausdruck. In unserem Beispiel sind dies die Zahlen für Tag, Monat und Jahr. Ersetzen Sie sie durch einen generischen Zahlenausdruck:

\d+/\d+/\d+

Der Ausdruck \d passt zu jeder Zahl einschließlich des Trennzeichens für Brüche. Das + bedeutet, dass eine oder mehrere Ziffern vorhanden sein müssen. Aber halt - das würde auch auf andere Zahlen passen, die gar keine Datumsangaben sind, wie 1234/521/5122. Um versehentliche Übereinstimmungen zu vermeiden, sollten Sie, wo immer möglich, präzise Ausdrücke verwenden. Als einfache Verbesserung haben wir uns entschieden, die Anzahl der Ziffern zu begrenzen:

\d{1,2}/\d{1,2}/\d{2,4}

Es gibt viele weitere Möglichkeiten, das Muster zu optimieren, aber eine davon ist speziell für i-net PDFC und hilft Ihnen, den Kontext des Musters genau zu definieren, um nur die zuletzt geänderten Daten zu entfernen:

Last Modified: (\d{1,2}/\d{2,4}/\d{2,4})

Ausdrücke in einer Klammer sind eine so genannte Übereinstimmungsgruppe. Der Filter passt immer noch auf den gesamten Ausdruck, aber nur der Inhalt der Übereinstimmungsgruppen wird ausgeschlossen.

Zeichenübereinstimmungsarten

Die kleinste Einheit beim Abgleich ist ein Zeichenabgleicher. Die folgenden Ausdrücke entsprechen jeweils einem einzelnen Zeichen. Eine vollständige Liste finden Sie in der Java Pattern Documentation

Einzelne Zeichen
x das Zeichen x
\\ das Backslash-Zeichen - beachten Sie, dass ein einzelnes eine Escape-Sequenz in regulären Ausdrücken ist
\t das Tabulatorzeichen (Unicode 0x0009)
\n das Zeichen für Zeilenumbruch / Zeilenvorschub (Unicode 0x000A)
\r das Wagenrücklaufzeichen (Unicode 0x000D)
Zeichengruppen
[xyz] entweder x, y oder t
[^abc] jedes Zeichen außer x, y oder z
[a-z0-9] a bis z (nur Kleinbuchstaben) oder 0 bis 9
[a-z&&[^b-y]] Subtraktion von Bereichen - Ergebnis ist hier nur a oder z
Vordefinierte Gruppen
. beliebiges Zeichen (außer dem Zeilenende, sofern nicht explizit angegeben)
\d / \D eine Ziffer / eine NICHT-Ziffer
\s / \S ein ASCII-Whitespace-Zeichen / ein NON-Whitespace-Zeichen
\w / \W ein Wortzeichen ([a-zA-Z_0-9]) / ein NICHT-Wortzeichen

Wortübereinstimmung

Um Wörter abzugleichen, verwenden Sie einfach die Zeichenabgleiche und erweitern sie um einen Quantifizierer.

Quantifizierer
X? Zeichenübereinstimmung X, einmal oder gar nicht
X* Zeichenübereinstimmung X, null oder mehr Mal
X+ Zeichenübereinstimmung X, ein oder mehrere Male
X{n} Zeichenübereinstimmung X, genau n-mal
X{n,} Zeichenabgleicher X, mindestens n-mal
X{n,m} Zeichenübereinstimmung X, mindestens n-mal, aber nicht mehr als m-mal

Ein Beispiel ist der Ausdruck

\d+

passt auf jede Zahl mit mindestens einer Ziffer.

Gieriger/zurückhaltender Quantifizierer

Ein sehr gebräuchlicher Ausdruck, um jeglichen Text zwischen zwei bekannten Ausdrücken auszuschließen, ist .*. Da der *-Operator aber gierig ist, wird er auf die maximale Anzahl von Zeichen passen, was in den meisten Fällen nicht das erwartete Ergebnis ist.

Um dies zu ändern, fügen Sie einfach ein ? an den Quantifizierer an. Zum Beispiel:

Muster Argument Erste übereinstimmende Folge
.* 12345 12345
.*? 12345 (überhaupt keine Übereinstimmung!)
\d+ 12345 12345
\d+? 12345 1
a.*z% a bis z oder z bis a a bis z oder z
a.*?z a zu z oder z zu a a zu z
a{1,3} aaaaa aaa
a{1,3}? aaaaa a

Als allgemeine Richtlinie sollten die nicht-gierigen Quantoren bevorzugt werden.

Übereinstimmungsgruppen

Reguläre Ausdrücke erlauben auch komplexere Muster. Jeder Begriff bis zu diesem Punkt kann in Klammern verschachtelt und wie ein einzelner Matcher verwendet werden. Zum Beispiel:

Muster Beispiel, das vollständig übereinstimmt
(123)+ 123123123
(\d{1,3},)*(\d{1,3})(.\d+)? 123,456,789.123
([0-9A-F]{2}-){5}[0-9A-F]{2} 0A-12-ED-32-9C-72

Hinweis: Wenn Sie Übereinstimmungsgruppen verwenden, schließt i-net PDFC nur die Inhalte aus, die mit diesen Gruppen übereinstimmen. Alle Teile des Musters, die außerhalb dieser Gruppen liegen, werden als Anker verwendet, aber nicht entfernt. Dies erspart zwar den Overhead der recht komplexen Look-ahead- und Look-behind-Gruppen, ist aber ein Problem, wenn reguläre Ausdrücke aus einer externen Quelle eingefügt werden.

Um dies zu vermeiden, können Sie einfach eine zusätzliche Gruppe um das gesamte Muster legen. Um dieses Verhalten für bestimmte Gruppen zu deaktivieren, muss die Gruppe mit dem Operator ?: auf nicht-erfassend gesetzt werden, z. B. (?:this|that).

Alternative Begriffe

Falls ein Matcher eine Liste von alternativen Begriffen abgleichen muss, können diese Begriffe mit dem Operator | definiert werden. Zum Beispiel:

Muster Beispiel, das vollständig übereinstimmt
(a|b)* abba
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) May (zum Beispiel)

Flags und Schalter

Einige Operatoren führen zu keiner Übereinstimmung, können aber verwendet werden, um das Verhalten der Abgleichsfunktion zu ändern.

Operator Wirkung
(?i) Schaltet auf Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung um
(?s) Schaltet den Operator . so um, dass er auch auf Zeilenumbrüche passt, ermöglicht mehrzeilige Übereinstimmungen
(?: ... ) Definiert eine nicht-erfassende Gruppe. i-net PDFC schließt Übereinstimmungen mit solchen Gruppen nicht aus, es sei denn, es gibt keine erfassenden Gruppen im Muster

Standardmuster

Pattern Anwendungsfall
Seite: (\d+) von (\d+) Seitenzahlen im Format n von m ignorieren
((19|20)\dd([- /.])(0[1-9]|1[012])([- /.])(0[1-9]|[12][0-9]|3[01])) Gültige Daten im Format Jahr-Monat-Tag