Perl kompatible reguläre Ausdrücke

Perl kompatible reguläre Ausdrücke
Originalautor (en) Philip Hasel
Stabile Veröffentlichung (en)
Pcre1 8.45 / 15. Juni 2021; Vor 13 Monaten[1]
Pcre2 10.40 / 15. April, 2022; vor 3 Monaten[2]
Repository
Geschrieben in C
Betriebssystem Plattformübergreifend
Typ Musteranpassung Bibliothek
Lizenz BSD
Webseite pcre.org Edit this at Wikidata

Perl kompatible reguläre Ausdrücke (Pcre) ist ein Bibliothek geschrieben in C, was ein implementiert a regulären Ausdruck Motor, inspiriert von den Fähigkeiten der Perl Programmiersprache. Philip Hasel begann im Sommer 1997 PCre zu schreiben.[3] Die Syntax von PCRE ist viel leistungsfähiger und flexibler als einer der der POSIX regulärer Ausdruck Aromen (Bre, ehe)[4] und als die vieler anderer regulärer Expressionsbibliotheken.

Während PCRE ursprünglich auf Merkmalsäquivalenz mit Perl abzielte, sind die beiden Implementierungen nicht vollständig äquivalent. Während der PCRE 7.x und Perl 5.9.x Phase haben die beiden Projekte die Entwicklung koordiniert, wobei Merkmale zwischen ihnen in beide Richtungen portiert werden.[5]

Im Jahr 2015 wurde eine Gabel von PCRE mit einer überarbeiteten Programmierschnittstelle (API) veröffentlicht. In der ursprünglichen Software, die jetzt PCRE1 (die 1.xx - 8.xx -Serie) genannt wird, hat Fehler gedrückt, aber keine weitere Entwicklung. Ab 2020Es wird als veraltet angesehen, und die aktuelle Version 8.45 ist wahrscheinlich die letzte. Der neue PCRE2 -Code (die 10.xx -Serie) hat eine Reihe von Erweiterungen und Codierungsverbesserungen und die Entwicklung findet statt.

A number of prominent Open-Source-Programme, so wie die Apache und Nginx HTTP -Server und die Php und R Skriptsprachen, integrieren Sie die PCRE -Bibliothek. Proprietäre Software kann ebenfalls tun, da die Bibliothek BSD-lizenziert ist. Ab Perl 5.10 ist PCRE auch als Ersatz für die Standard-Expressionsmotor von Perl über die erhältlich re::engine::PCRE Modul.

Die Bibliothek kann auf Unix, Windows und mehreren anderen Umgebungen aufgebaut werden. PCRE2 ist mit einem POSIX C -Wrapper verteilt,[Anmerkung 1] Mehrere Testprogramme und das Versorgungsprogramm pcre2grep Eingebautes Tandem mit der Bibliothek.

Merkmale

Just-in-Time-Compiler Unterstützung

Diese optionale Funktion ist verfügbar, wenn die PCRE2 -Bibliothek erstellt wurde. Große Leistungsvorteile sind möglich, wenn (z. B.) das aufrufende Programm die Funktion mit kompatiblen Mustern verwendet, die wiederholt ausgeführt werden. Die Just-in-Time-Compiler-Unterstützung wurde von Zoltan Herczeg geschrieben und wird nicht im POSIX-Wrapper behandelt.

Flexible Speicherverwaltung

Die Verwendung des Systemstapels zur Rückverfolgung kann in PCRE1 problematisch sein, weshalb diese Funktion der Implementierung in PCRE2 geändert wurde. Der Haufen wird jetzt für diesen Zweck verwendet und der Gesamtbetrag kann begrenzt werden. Das Problem von Paketüberfluss, das regelmäßig mit PCRE1 aufgetaucht ist, ist mit PCRE2 aus Release 10.30 (2017) kein Problem mehr.

Konsequente Fluchtregeln

Wie Perl hat PCRE2 konsistente Entkommensregeln: Jeder nicht-alpha-numerische Charakter kann entkommen sein, um seinen wörtlichen Wert durch Präfixen zu bedeuten \ (Backslash) vor dem Charakter. Jeder alpha-numerische Charakter, dem ein Backslash vorausging, gibt ihm normalerweise eine besondere Bedeutung. In dem Fall, in dem die Sequenz nicht als besonders definiert wurde, tritt ein Fehler auf. Dies unterscheidet sich von Perl, was nur dann einen Fehler ergibt, wenn er sich im Warnmodus befindet (PCRE2 hat keinen Warnmodus). In den regulären grundlegenden regelmäßigen Ausdrücken entging die Rückstände manchmal nicht-alpha-numerik (z. \.), und manchmal führten sie ein spezielles Merkmal ein (z. \(\)).

Erweiterte Charakterklassen

Einzelhandel Charakterklassen werden zusätzlich zu den längeren POSIX -Namen unterstützt. Zum Beispiel, \d entspricht jeder Ziffer genau wie [[:digit:]] würde in posix regulären Ausdrücken.

Minimales Matching (a.k.a. "Ungreedy")

A ? kann nach einem Wiederholungsquantifizierer platziert werden, um anzuzeigen, dass die kürzeste Übereinstimmung verwendet werden sollte. Die Standardeinstellung ist, die zu versuchen längstes Match Erster und Backtrack durch kürzere Übereinstimmungen: z. a.*?b würde zuerst "AB" in "Ababab" übereinstimmen, wo a.*b würde mit der gesamten Zeichenfolge übereinstimmen.

Wenn die U Die Flag wird gesetzt, dann sind Quantifizierer standardmäßig Ungreedy (faul) ? macht sie gierig.

Unicode -Zeicheneigenschaften

Unicode Definiert mehrere Eigenschaften für jeden Charakter. Muster in PCRE2 können mit diesen Eigenschaften übereinstimmen: z. \p{Ps}.*?\p{Pe} würde eine Zeichenfolge übereinstimmen, die mit einer "Eröffnungszeichen" beginnt und mit jeder "engen Zeichensetzung" wie endet, wie z. [abc]. Die Übereinstimmung bestimmter "normaler" Metacharacter kann durch Unicode -Eigenschaften angetrieben werden, wenn die Kompilierungsoption pcre2_UCP eingestellt ist. Die Option kann für ein Muster eingestellt werden, indem Sie einbeziehen (*UCP) zu Beginn des Musters. Die Option verändert das Verhalten der folgenden Metacharacter: \B, \b, \D, \d, \S, \s, \W, \wund einige der POSIX -Charakterklassen. Zum Beispiel der Satz der Zeichen, die von übereinstimmten \w (Word -Zeichen) wird erweitert, um Buchstaben und Akzentschreiben zu enthalten, wie sie von Unicode -Eigenschaften definiert sind. Eine solche Übereinstimmung ist langsamer als die Normale (ASCII-Nur) Nicht-UKP-Alternative. Beachten Sie, dass die UCP -Option erfordert, dass die Bibliothek erstellt wurde, um Unicode -Unterstützung einzuschließen (dies ist die Standardeinstellung für PCRE2). Sehr frühe Versionen von PCRE1 unterstützten nur ASCII -Code. Später wurde die UTF-8-Unterstützung hinzugefügt. Die Unterstützung für UTF-16 wurde in Version 8.30 und die Unterstützung für UTF-32 in Version 8.32 hinzugefügt. PCRE2 hat immer alle drei UTF -Codierungen unterstützt.

Multiline -Matching

^ und $ Kann zu Beginn und am Ende einer String nur oder am Anfang und am Ende jeder "Zeile" innerhalb der Zeichenfolge übereinstimmen, je nachdem, welche Optionen festgelegt werden.

Newline/LineBreak -Optionen

Wenn PCRE zusammengestellt wird, wird eine neue Line -Standardeinstellung ausgewählt. Welcher Newline/LineBreak wirkt sich in Wirklichkeit aus, wo PCRE erkennt ^ Zeilenanfierungen und $ endet (im Multiline -Modus) sowie dem, was mit Punkten übereinstimmt (unabhängig vom Multiline -Modus, es sei denn, die Dotall -Option (?s) ist eingestellt). Es wirkt sich auch auf das PCRE -Matching -Verfahren aus (da Version 7.0): Wenn ein unanwendschaftliches Muster zu Beginn einer Newline -Sequenz nicht übereinstimmt, ist PCRE vor der Wiederholung der Übereinstimmung nach der gesamten Newline -Sequenz vorbei. Wenn die neue Alternative zur Newline -Option CRLF als einen der gültigen Zeilenbräuche enthält, überspringt es nicht die \n in einem CRLF, wenn das Muster spezifisch enthält \r oder \n Referenzen (seit Version 7.3). Seit Version 8.10 der Metacharacter \N Stimmt immer zu einem anderen Charakter als LineBreak -Zeichen. Es hat das gleiche Verhalten wie . Wenn die Dotall -Option auch bekannt ist, auch bekannt als (?s) ist nicht in Kraft.

Die Option Newline kann mit externen Optionen geändert werden, wenn PCRE zusammengestellt wird und wenn sie ausgeführt wird. Einige Anwendungen, die PCRE verwenden, bieten den Benutzern die Möglichkeit, diese Einstellung über eine externe Option anzuwenden. Die Option Newline kann also zu Beginn des Musters unter Verwendung eines der folgenden Angaben auch angegeben werden:

  • (*LF) Newline ist ein Linefeed -Charakter. Entsprechende Linienbräuche können mit miteinander abgestimmt werden \n.
  • (*CR) Newline ist eine Kutschenrendite. Entsprechende Linienbräuche können mit miteinander abgestimmt werden \r.
  • (*CRLF) Newline/LineBreak ist eine Kutschenrendite, gefolgt von einem Linefeed. Entsprechende Linienbräuche können mit miteinander abgestimmt werden \r\n.
  • (*ANYCRLF) Jedes der oben genannten in den Daten aufgenommenen Daten wird eine neue Verarbeitung auslösen. Entsprechende Linienbräuche können mit miteinander abgestimmt werden (?:\r\n?|\n) oder mit \R. Im Folgenden finden Sie die Konfiguration und Optionen in Bezug auf das, was mit Backslash-R entspricht.
  • (*ANY) Einer der oben genannten plus speziellen Unicode -Line -Breaks.

Wenn nicht im UTF-8-Modus (?:\r\n?|\n|\x0B|\f|\x85)[Anmerkung 2] oder \R.

Im UTF-8-Modus werden zwei zusätzliche Zeichen erkannt, wenn die Zeilenbrüche mit bricht (*ANY):

  • LS (Zeilenabscheider, U+2028),
  • PS (Absatzabscheider, U+2029).

Unter Windows, in nicht-nicht-Unicode-Daten, einige der ANY LineBreak -Charaktere haben andere Bedeutungen.

Zum Beispiel, \x85 kann mit einer horizontalen Ellipsis übereinstimmen, und wenn sie angetroffen werden, während der ANY Newline ist in Kraft, es würde eine neue Verarbeitung auslösen.

Im Folgenden finden Sie die Konfiguration und Optionen in Bezug auf das, was mit Backslash-R entspricht.

Backslash-R-Optionen

Wenn PCRE zusammengestellt wird, wird ein Standard für die Übereinstimmung ausgewählt \R. Die Standardeinstellung kann entweder mit den Zeileneinbrüchen übereinstimmen, die einer beliebigen Anycrlf oder derjenigen entsprechen. Die Standardeinstellung kann bei Bedarf durch Einbeziehung überschrieben werden (*BSR_UNICODE) oder (*BSR_ANYCRLF) zu Beginn des Musters. Bei der Bereitstellung a (*BSR..) Option können Sie auch eine bereitstellen (*Neue Zeile) Option, z. B.,, (*Bsr_unicode) (*angemessen) Rest des Musters. Die Backslash-R-Optionen können auch mit externen Optionen von der Anwendung geändert werden, wenn ein Muster kompiliert wird.

Beginn der Musteroptionen

LineBreak -Optionen wie z. (*LF) oben dokumentiert; Backslash-R-Optionen wie z. (*BSR_ANYCRLF) oben dokumentiert; Option für Unicode -Zeicheneigenschaften (*UCP) oben dokumentiert; (*UTF8) Option wie folgt dokumentiert: Wenn Ihre PCRE2 -Bibliothek zusammengestellt wurde UTF Unterstützung können Sie die angeben (*UTF) Option am Anfang eines Musters, anstatt eine externe Option einzustellen, um UTF-8, UTF-16 oder UTF-32-Modus aufzurufen.

Hinterreferenzen

Ein Muster kann sich auf die Ergebnisse einer vorherigen Übereinstimmung beziehen. Zum Beispiel, (a|b)c\1 Würde entweder "ACA" oder "BCB" übereinstimmen und würde zum Beispiel nicht mit "ACB" übereinstimmen.

Benannte Subpattern

Ein Untermuster (umgeben von Klammern wie, wie (...)) kann benannt werden, indem ein führender Leitfaden einbezogen werden ?P Nach der öffnenden Klammern. Benannte Subpatterns sind ein Merkmal, von dem PCre übernommen wurde Python Reguläre Ausdrücke.

Diese Funktion wurde anschließend von Perl übernommen, sodass jetzt auch Gruppen benannt werden können (?...) oder (?'name'...), ebenso gut wie (?P...). Namensgruppen können beispielsweise beispielsweise beispielsweise nachgedacht werden: (?P=name) (Python -Syntax) oder \k'name' (Perl -Syntax).

Unterroutinen

Während eine Rückreferenz einen Mechanismus bietet, der sich auf den Teil des Subjekts bezieht, der zuvor mit einem Untermaterial übereinstimmt, bietet eine Unterroutine einen Mechanismus zur Wiederverwendung eines zugrunde liegenden zuvor definierten Subpatterns. Die Optionen des Subpatterns, wie die Fallunabhängigkeit, werden festgelegt, wenn das Subpattern definiert ist. (a.c)(?1) Würde "AACABC" oder "ABCADC" übereinstimmen, während ein Hinterreferenz mit einem Rückreferenz mit (a.c)\1 Würde nicht, obwohl beide mit "AACAAC" oder "ABCABC" übereinstimmen würden. PCRE unterstützt auch eine Nicht-Perl Oniguruma Konstrukt für Unterprogramme. Sie werden verwendet \g oder \g.

Atomgruppierung

Atomgruppierung ist eine Methode zur Verhinderung Backtracking in einem Muster. Zum Beispiel, a++bc Wird so viele "A" wie möglich übereinstimmen und nie wieder einsetzt, um es weniger auszuprobieren.

Aussehen und Aussehen behaupten

Behauptung Schaue zurück Schau voraus
Positiv (?<=Muster)) (?=Muster))
Negativ (?Muster)) (?!Muster))
Aussehen und Aussehen und Aussehen behaupten
in Perl Reguläre Ausdrücke

Muster können behaupten, dass der vorherige Text oder der nachfolgende Text ein Muster ohne konsumierenden Text (Zero-Width Assertion) enthält. Zum Beispiel, /\w+(?=\t)/ entspricht einem Wort, gefolgt von a Tab, ohne die Registerkarte selbst einzubeziehen.

Die Aussichtspunkte können jedoch nicht unsicher sein (im Gegensatz zu Perl). Jeder Zweig kann eine andere feste Länge haben.

\K Kann in einem Muster verwendet werden, um den Beginn der aktuellen Gesamtübereinstimmung zurückzusetzen. Dies liefert einen flexiblen alternativen Ansatz für die Aussicht, die Behauptungen aussehen \K) muss nicht in Länge festgelegt werden.

Escape-Sequenzen für Null-Breiten-Behauptungen

Z.B. \b Für die Übereinstimmung mit "Wortgrenzen" von Zero-Width, ähnlich wie (?<=\W)(?=\w)|(?<=\w)(?=\W)|^|$.

Kommentare

Ein Kommentar beginnt mit (?# und endet bei der nächsten schließenden Klammer.

Rekursive Muster

Ein Muster kann sich rekursiv oder auf jedes Untermaterial auf sich selbst beziehen. Zum Beispiel das Muster \((a*|(?R))*\) entspricht einer beliebigen Kombination aus ausgewogenen Klammern und "a" s.

Generische Callouts

PCRE -Ausdrücke können einbetten (? CN), wo n ist eine Nummer. Dadurch wird eine externe benutzerdefinierte Funktion über die PCRE-API aufgerufen und kann verwendet werden, um beliebigen Code in ein Muster einzubetten.

Unterschiede von Perl

Zu den Unterschieden zwischen PCRE2 und Perl (ab Perl 5.9.4) gehören, sind aber nicht beschränkt auf:[6]

Bis zur Veröffentlichung 10.30 waren rekursiv

Das bedeutete das "<<!>!>!>><>>!>!>!>" =~ /^(<(?:[^<>]+|(?3)|(?1))*>)()(!>!>!>)$/ würde in Perl, aber nicht in PCRE2 bis Release 10.30 übereinstimmen.

Der Wert eines von der abgeleiteten Erfassungspuffer ? Quantifizierer (Übereinstimmung 1 oder 0 mal), wenn in einem anderen quantifizierten Erfassungspuffer verschachtelt ist, ist unterschiedlich

In Perl "aba" =~ /^(a(b)?)+$/; wird darin enden, dass $1 mit "a" und enthält und $2 enthält undef, aber in PCre wird dazu führen $2 enthält "B".

PCRE ermöglicht benannte Capture -Puffer, numerische Namen zu erhalten. Perl verlangt, dass der Name der Regel von BareWords folgt

Das bedeutet, dass \g{} ist in Perl eindeutig, aber in PCRE möglicherweise mehrdeutig.

Dies ist kein Unterschied mehr seit PCRE 8.34 (veröffentlicht in den Jahren 2013-12-15), wodurch Gruppennamen nicht mehr mit einer Ziffer beginnen können.[7]

PCRE ermöglicht Alternativen innerhalb von Lookbehind unterschiedliche Längen

Innerhalb von LookBehind-Behauptungen erfordern sowohl PCRE- als auch Perl-Muster mit fester Länge.

Das heißt, sowohl PCRE- als auch Perl-Muster der variablen Länge unter Verwendung von Quantifizierern innerhalb der Aussichtspunkte.

Perl verlangt jedoch, dass alle alternativen Zweige einer Aussichtsbehandlung die gleiche Länge wie einander sind, während PCRE diesen alternativen Zweigen ermöglicht, unterschiedliche Längen voneinander zu haben, solange jeder Zweig noch eine feste Länge hat.

PCRE unterstützt bestimmte "experimentelle" Perlkonstrukte nicht

Wie zum Beispiel (??{...}) (Ein Rückruf, dessen Rückgabe als Teil des Musters bewertet wird) oder der (?{}) Konstrukte, obwohl letztere mit Verwendung emuliert werden kann (?Cn).

Rekursionskontrollverben, die in der Perl 5.9.x -Reihe hinzugefügt wurden, werden ebenfalls nicht unterstützt.

Die Unterstützung für experimentelle Backtracking -Kontrollverben (in Perl 5.10 hinzugefügt) ist seit Version 7.3 in PCRE erhältlich.

Sie sind (*FAIL), (*F), (*PRUNE), (*SKIP), (*THEN), (*COMMIT), und (*ACCEPT).

Perls entsprechende Verwendung von Argumenten mit Backtracking -Steuerverben wird im Allgemeinen nicht unterstützt.

Beachten Sie jedoch, dass PCRE seit Version 8.10 die folgenden Verben mit einem angegebenen Argument unterstützt: (*MARK:markName), (*SKIP:markName), (*PRUNE:markName), und (*THEN:markName).

Seit Version 10.32 PCRE2 unterstützt (*ACCEPT:markName), (*FAIL:markName), und (*COMMIT:markName).

PCRE und Perl unterscheiden sich in ihrer Toleranz gegenüber fehlerhaften Konstrukten geringfügig

Perl ermöglicht Quantifizierer auf der (?!...) Konstrukt, das bedeutungslos, aber harmlos ist (wenn auch ineffizient); PCRE erzeugt einen Fehler in den Versionen vor 8.13.

PCRE hat eine harte Begrenzung für die Rekursionstiefe, Perl nicht

Mit Standard -Build -Optionen "bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" =~ /.X(.+)+X/ Wird aufgrund der Grenze nicht übereinstimmen, aber Perl passt zu korrekt.

Perl verwendet den Heap für die Rekursion und hat keine feste Grenze für die Rekursionstiefe, während PCRE2 ein Standard-Standardlimit aufweist, das durch die aufrufende Anwendung nach oben oder unten angepasst werden kann.

Überprüfung

Mit Ausnahme der oben genannten Punkte kann PCRE die Tests in der Perl bestehen. "t/op/re_tests"Datei, einer der Haupt-Regressionstests auf Syntax-Ebene für Perls reguläre Expression Engine.

Notizen und Referenzen

Anmerkungen

  1. ^ Die Core PCRE2 -Bibliothek bietet sowohl Übereinstimmung als auch Übereinstimmung und Ersetzung der Funktionalität.
  2. ^ Sicher das \x85 Teil ist nicht \xC2\x85? (d.h. (?:\r\n?|\n|\x0B|\f|\xC2\x85), wie U+0085! = 0x85)

    Vorbehalt: Wenn das Muster \xC2\x85 Arbeit nicht funktionieren: Experimentieren Sie mit den Unicode -Einstellungen der Regex -Implementierung oder versuchen Sie es mit Folgendem zu ersetzen:
    • \x{0085}
    • \u0085

Verweise

[8]

  1. ^ Endgültige Veröffentlichung von PCRE1: https://lists.exim.org/lurker/message/20210615.162400.c16ff8a3.en.html
  2. ^ Veröffentlichungen: https://github.com/pcre2project/pcre2/releases
  3. ^ Exim und Pcre: Wie kostenlose Software mein Leben entführte (1999-12), von Philip Hasel, p. 7: https://www.ukuug.org/events/winter99/proc/ph.ps

    Was ist mit PCRE?

    • Geschriebener Sommer 1997, platziert auf der FTP -Website.
    • Die Leute fanden es und starteten eine Mailingliste.
    • Es gab ein Rinnsal von Verbesserungen.
  4. ^
  5. ^ PCRE2 - Perl -kompatible reguläre Ausdrücke (überarbeitete API) (2020), von Universität von Cambridge: https://pcre.org/pcre2.txt
  6. ^ Unterschiede zwischen PCRE2 und Perl (2019-07-13), von Philip Hasel: https://www.pcre.org/current/doc/html/pcre2compat.html
  7. ^ Zitieren pcre changelog (https://www.pcre.org/original/Changelog.txt): "Perl lässt Gruppennamen nicht mehr mit Ziffern beginnen, daher habe ich diese Änderung auch in PCRE vorgenommen."
  8. ^ ChangeLog für PCRE2: https://www.pcre.org/changelog.txt

Siehe auch

Externe Links