Perl kompatible reguläre Ausdrücke
Originalautor (en) | Philip Hasel |
---|---|
Stabile Veröffentlichung (en) | |
Repository | |
Geschrieben in | C |
Betriebssystem | Plattformübergreifend |
Typ | Musteranpassung Bibliothek |
Lizenz | BSD |
Webseite | pcre |
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 2020[aktualisieren]Es 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
, \w
und 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
- ^ Die Core PCRE2 -Bibliothek bietet sowohl Übereinstimmung als auch Übereinstimmung und Ersetzung der Funktionalität.
- ^ 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
- ^ Endgültige Veröffentlichung von PCRE1: https://lists.exim.org/lurker/message/20210615.162400.c16ff8a3.en.html
- ^ Veröffentlichungen: https://github.com/pcre2project/pcre2/releases
- ^ 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.
- ^
- Regelmäßiger Ausdruck - POSIX -Standard (Google -Suche): https://www.google.com/search?num=100&q=%22regular+Expression%22%7C%22regular+Expression%22%7C%22Regex%22%7C%22Rexp%22+Site%3apubs.openGroup.org.org +Inurl%3AonlinePubs%2F9699919799+-Intle%3a%22Index+von+%2Fonlinepubs%22+-inurl%3aidx+-inurl%3AContents INURL%3A2016Edition+-inurl%3A2018Dition
- Dienstprogramme § Muster -Matching Notation: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/v3_chap02.html#tag_18_13
- Basisdefinitionen § Grundlegende reguläre Ausdrücke: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/basedefs/v1_chap09.html#tag_09_03
- Begründung § reguläre Ausdrücke: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/xrat/v4_xbd_chap09.html#tag_21_09
- ^ PCRE2 - Perl -kompatible reguläre Ausdrücke (überarbeitete API) (2020), von Universität von Cambridge: https://pcre.org/pcre2.txt
- ^ Unterschiede zwischen PCRE2 und Perl (2019-07-13), von Philip Hasel: https://www.pcre.org/current/doc/html/pcre2compat.html
- ^ 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."
- ^ ChangeLog für PCRE2: https://www.pcre.org/changelog.txt
Siehe auch
Externe Links
- Offizielle Website
- PCRE - Entwicklungsmischliste: https://groups.google.com/g/pcre2-tev
- PCRE - Bug Tracker: https://github.com/pcre2project/pcre2/issues
- Musteranpassung mit regulären Ausdrücken (2010-03-02) von Nick MacLaren, Philip Hazel: https://www-uxsup.csx.cam.ac.uk/courses/moved.res/paper.pdf
- PCRE 8.43 (2019-04)-Windows Cygwin x86-64: https://www-uxsup.csx.cam.ac.uk/pub/windows/cygwin/x86_64/release/pcre/