Regelmäßiger Ausdruck

In der Computerwissenschaft stellt ein regelmäßiger Ausdruck einen kurzen zur Verfügung, und flexibles bedeutet "zusammenzupassen" (geben Sie an und erkennen Sie an) Schnuren des Textes, wie besondere Charaktere, Wörter oder Muster von Charakteren. Allgemeine Abkürzungen für den "regelmäßigen Ausdruck" schließen regex und regexp ein. Das Konzept regelmäßiger Ausdrücke wurde zuerst durch Dienstprogramme verbreitet, die durch den Vertrieb von Unix, insbesondere die Redakteur-Hrsg. und der Filter grep zur Verfügung gestellt sind. Ein regelmäßiger Ausdruck wird auf einer formellen Sprache geschrieben, die durch einen regelmäßigen Ausdruck-Verarbeiter interpretiert werden kann, der ein Programm ist, das entweder als ein parser Generator dient oder Text untersucht und Teile identifiziert, die die zur Verfügung gestellte Spezifizierung vergleichen. Historisch wird das Konzept regelmäßiger Ausdrücke mit dem Formalismus von Kleene von regelmäßigen Sätzen, eingeführt in den 1950er Jahren vereinigt.

Der folgende ist Beispiele von Spezifizierungen, die als ein regelmäßiger Ausdruck ausgedrückt werden können:

  • die Folge von Charakteren "Auto", das aufeinander folgend, solcher als im "Auto", "Cartoon" oder "Bikarbonat" erscheint
  • das Wort"Auto", wenn es als ein isoliertes Wort (und abgegrenzt von anderen Wörtern, normalerweise durch whitespace Charaktere) erscheint
  • das Wort "Auto", wenn vorangegangen, durch das Wort "Motor" (und getrennt durch ein genanntes Begrenzungszeichen oder vielfach.)

Regelmäßige Ausdrücke werden von vielen Textaufbereitern, Dienstprogrammen und Programmiersprachen verwendet, um auf Mustern gestützten Text zu suchen und zu manipulieren. Einige dieser Sprachen, einschließlich Perl, Rubins, AWK, und Tcl, integrieren regelmäßige Ausdrücke in die Syntax der Kernsprache selbst. Andere Programmiersprachen wie.NET Sprachen, Java und Pythonschlange stellen stattdessen regelmäßige Ausdrücke durch Standardbibliotheken zur Verfügung. Für noch andere Sprachen, wie Object Pascal (Delphi) und C und C ++, sind Nichtkernbibliotheken verfügbar (jedoch, Version C ++ 11 stellt regelmäßige Ausdrücke in seinen Standardbibliotheken zur Verfügung).

Als ein Beispiel der Syntax kann der regelmäßige Ausdruck verwendet werden, um nach allen Beispielen der Schnur "ab" das Auftreten danach "Wortgrenzen" zu suchen. So wird die zusammenpassende Schnur "ab" in zwei möglichen Positionen, (1) am Anfang Wörter, und (2) zwischen zwei Charakteren in einer Schnur finden, wo das erste nicht ist, sind ein Wortcharakter und das zweite ein Wortcharakter. Zum Beispiel, in der Schnur "Texte für Experten" passt "ab" in "Experten", aber nicht in "Texten" zusammen (weil "ab" innerhalb eines Wortes und nicht sofort nach einer Wortgrenze vorkommt).

Viele moderne Rechensysteme stellen Wildcard-Charaktere im Zusammenbringen von Dateinamen von einem Dateisystem zur Verfügung. Das ist eine Kernfähigkeit zu vielen Schalen der Befehl-Linie und ist auch bekannt als globbing. Wildcards unterscheiden sich von regelmäßigen Ausdrücken im allgemeinen Ausdrücken nur von beschränkten Formen von Mustern.

Grundlegende Konzepte

Ein regelmäßiger Ausdruck, häufig genannt ein Muster, ist ein Ausdruck, der eine Reihe von Schnuren angibt. Um solche Sätze von Schnuren anzugeben, sind Regeln häufig kürzer als Listen Mitglieder eines Satzes. Zum Beispiel kann der Satz, der die drei Schnuren "Handel", "Händel" und "Haendel" enthält, durch das Muster angegeben werden (oder wechselweise es wird gesagt, dass das Muster jede der drei Schnuren vergleicht). In den meisten Formalismen, wenn dort mindestens ein regex besteht, der einen besonderen Satz dann vergleicht, dort bestehen eine unendliche Zahl solcher Ausdrücke. Die meisten Formalismen stellen die folgenden Operationen zur Verfügung, um regelmäßige Ausdrücke zu bauen.

Boolean "oder"

:A vertikale Bar trennt Alternativen. Zum Beispiel, kann "grau" oder "grau" zusammenpassen.

Gruppierung

:Parentheses werden verwendet, um das Spielraum und die Priorität der Maschinenbediener (unter anderem Gebrauch) zu definieren. Zum Beispiel, und sind gleichwertige Muster, die sowohl den Satz von "grau" als auch "Grau" beschreiben Sie.

Quantifizierung

:A quantifier nach einem Jeton (wie ein Charakter) oder Gruppe gibt an, wie oft diesem vorhergehenden Element erlaubt wird vorzukommen. Die allgemeinsten quantifiers sind das Fragezeichen, das Sternchen (ist auf den Stern von Kleene zurückzuführen gewesen), und das Pluszeichen (Kreuz von Kleene).

:

Diese Aufbauten können verbunden werden, um willkürlich komplizierte Ausdrücke zu bilden, viel wie kann man arithmetische Ausdrücke von Zahlen und den Operationen +, , ×, und ÷ bauen. Zum Beispiel, und sind beide gültige Muster, die dieselben Schnuren wie das frühere Beispiel vergleichen.

Die genaue Syntax für regelmäßige Ausdrücke ändert sich unter Werkzeugen und mit dem Zusammenhang; mehr Detail wird in der Syntax-Abteilung gegeben.

Geschichte

Die Ursprünge von regelmäßigen Ausdrücken liegen in der Automaten-Theorie und formellen Sprachtheorie, von denen beide ein Teil der theoretischen Informatik sind. Diese Felder studieren Modelle der Berechnung (Automaten) und Weisen, formelle Sprachen zu beschreiben und zu klassifizieren. In den 1950er Jahren hat Mathematiker Stephen Cole Kleene diese Modelle mit genannten regelmäßigen Sätzen seiner mathematischen Notation beschrieben. Die SNOBOL Sprache war eine frühe Durchführung des Muster-Zusammenbringens, aber nicht identisch zu regelmäßigen Ausdrücken. Ken Thompson hat die Notation von Kleene in den Redakteur QED als ein Mittel eingebaut, Muster in Textdateien zu vergleichen. Er hat später diese Fähigkeit zum Redakteur von Unix Hrsg. hinzugefügt, die schließlich zum populären Suchwerkzeug-Grep'S-Gebrauch von regelmäßigen Ausdrücken geführt hat ("grep", ist ein Wort ist auf den Befehl für den regelmäßigen Ausdruck zurückzuführen gewesen, der im Hrsg.-Redakteur sucht: Wo re für regelmäßigen Ausdruck eintritt). Seit dieser Zeit sind viele Schwankungen der ursprünglichen Anpassung von Thompson von regelmäßigen Ausdrücken in Dienstprogrammen von Unix und Unix-like einschließlich expr, AWK, Emacs, vi, und lex weit verwendet worden.

Perl und Tcl regelmäßige Ausdrücke wurden aus einer regex von Henry Spencer geschriebenen Bibliothek abgeleitet, obwohl sich Perl später auf der Bibliothek von Spencer ausgebreitet hat, um viele neue Eigenschaften hinzuzufügen. Philip Hazel hat PCRE entwickelt (Perl Vereinbare Regelmäßige Ausdrücke), der versucht, die regelmäßige Ausdruck-Funktionalität von Perl nah nachzuahmen, und durch viele moderne Werkzeuge einschließlich PHP und HTTP Apachen-Servers verwendet wird. Ein Teil der Anstrengung im Design von Perl 6 soll die regelmäßige Ausdruck-Integration von Perl verbessern, und ihr Spielraum und Fähigkeiten zu vergrößern, die Definition zu erlauben, Ausdruck-Grammatiken grammatisch zu analysieren. Das Ergebnis ist eine Minisprache genannt Perl 6 Regeln, die verwendet werden, um Perl 6 Grammatik zu definieren sowie ein Werkzeug Programmierern auf der Sprache zur Verfügung zu stellen. Diese Regeln erhalten vorhandene Eigenschaften von Perl 5.x regelmäßige Ausdrücke aufrecht, sondern auch erlauben BNF-artige Definition eines rekursiven Abstiegs parser über Subregeln.

Der Gebrauch von regelmäßigen Ausdrücken in strukturierten Informationsstandards für das Dokument und Datenbankmodellieren hat in den 1960er Jahren angefangen und hat sich in den 1980er Jahren wenn Industriestandards wie ISO SGML (precursored durch ANSI "GCA 101-1983") konsolidiert ausgebreitet. Der Kern der Struktur-Spezifizierungssprachstandards besteht aus regelmäßigen Ausdrücken. Sein Gebrauch ist in der DTD Element-Gruppensyntax offensichtlich.

Formelle Sprachtheorie

Regelmäßige Ausdrücke beschreiben regelmäßige Sprachen in der formellen Sprachtheorie. Sie haben dieselbe ausdrucksvolle Macht wie regelmäßige Grammatiken.

Formelle Definition

Regelmäßige Ausdrücke bestehen aus Konstanten und Maschinenbediener-Symbolen, die Sätze von Schnuren und Operationen über diese Sätze beziehungsweise anzeigen. Die folgende Definition ist normal, und als solcher in den meisten Lehrbüchern auf der formellen Sprachtheorie gefunden. In Anbetracht eines begrenzten Alphabetes Σ werden die folgenden Konstanten definiert

als regelmäßige Ausdrücke:

  • (leerer Satz) Bezeichnung des Satzes.
  • (leere Schnur) ε Bezeichnung des Satzes, der nur die "leere" Schnur enthält, die keine Charaktere überhaupt hat.
  • (wörtlicher Charakter) in Σ, der den Satz anzeigt, der nur den Charakter a enthält.

In Anbetracht regelmäßiger Ausdrücke R und S werden die folgenden Operationen über sie definiert

regelmäßige Ausdrücke zu erzeugen:

  • (Verkettung) RS Bezeichnung des Satzes {αβ α im Satz, der durch den Ausdruck R und β im Satz beschrieben ist, der durch S} beschrieben ist. Zum Beispiel {"ab", "c"} {"d", "ef"} = {"abd", "abef", "cd", "cef"}.
  • (Wechsel) R S Bezeichnung der Satz-Vereinigung von Sätzen, die durch R und S beschrieben sind. Zum Beispiel, wenn R {"ab", "c"} beschreibt und S {"ab", "d", "ef"} beschreibt, beschreibt Ausdruck R S {"ab", "c", "d", "ef"}.
  • (Stern von Kleene) R*, der die kleinste Obermenge des Satzes anzeigt, der durch R beschrieben ist, der ε enthält und unter der Schnur-Verkettung geschlossen wird. Das ist der Satz aller Schnuren, die durch das Verketten jeder begrenzten Zahl (einschließlich der Null) Schnuren vom durch R beschriebenen Satz gemacht werden können. Zum Beispiel, {"0", "1"} * ist der Satz aller begrenzten binären Schnuren (einschließlich der leeren Schnur), und {"ab", "c"} * = {ε, "ab", "c", "abab", "Alphabet", "Taxi", "Cc", "ababab", "abcab"...}.

Um Parenthesen zu vermeiden, wird es angenommen, dass der Stern von Kleene den höchsten Vorrang, dann Verkettung hat und dann Vereinigung gesetzt hat. Wenn es keine Zweideutigkeit dann gibt, können Parenthesen weggelassen werden. Zum Beispiel, kann als geschrieben werden, und kann als geschrieben werden.

Viele Lehrbücher verwenden die Symbole, oder für den Wechsel statt der vertikalen Bar.

Beispiele:
  • zeigt {ε, a, b, bb, bbb an... }\
  • zeigt den Satz aller Schnuren ohne Symbole außer a und b einschließlich der leeren Schnur an: {ε, a, b, aa, ab, ba, bb, aaa... }\
  • zeigt den Satz von Schnuren an, die mit a, dann Null oder mehr Bakkalaureus der Naturwissenschaften und schließlich fakultativ ein c anfangen: {a, ac, ab, Alphabet, abb, abbc... }\

Ausdrucksvolle Macht und Kompaktheit

Die formelle Definition von regelmäßigen Ausdrücken ist vorsätzlich geizig und vermeidet, den überflüssigen quantifiers zu definieren, und, der wie folgt ausgedrückt werden kann: =, und =. Manchmal wird der Ergänzungsmaschinenbediener hinzugefügt, um einen verallgemeinerten regelmäßigen Ausdruck zu geben; hier vergleicht R alle Schnuren über Σ*, die R nicht vergleichen. Im Prinzip ist der Ergänzungsmaschinenbediener überflüssig, weil es immer durch das Verwenden der anderen Maschinenbediener umschrieben werden kann. Jedoch ist der Prozess, um solch eine Darstellung zu schätzen, kompliziert, und das Ergebnis kann Ausdrücke einer Größe verlangen, die exponential größer doppelt ist.

Regelmäßige Ausdrücke in diesem Sinn können die regelmäßigen Sprachen, genau die Klasse von durch deterministische begrenzte Automaten akzeptierten Sprachen ausdrücken. Es, gibt jedoch, einen bedeutenden Unterschied in der Kompaktheit. Einige Klassen von regelmäßigen Sprachen können nur durch deterministische begrenzte Automaten beschrieben werden, deren Größe exponential in der Größe der kürzesten gleichwertigen regelmäßigen Ausdrücke wächst. Das Standardbeispiel hier ist die Sprachen

L, aus allen Schnuren über das Alphabet {a, b} bestehend, wessen k-last Brief a gleichkommt. Einerseits wird durch einen regelmäßigen Ausdruck, der L beschreibt, gegeben. Die Generalisierung dieses Musters zu L gibt den Ausdruck

:

Andererseits ist es bekannt, dass jeder deterministische begrenzte Automat, der die Sprache L akzeptiert, mindestens 2 Staaten haben muss. Glücklicherweise gibt es von regelmäßigen Ausdrücken bis die allgemeineren nichtdeterministischen begrenzten Automaten (NFAs) einfach kartografisch darzustellen, der zu solch einer Explosion in der Größe nicht führt; aus diesem Grund werden NFAs häufig als alternative Darstellungen von regelmäßigen Sprachen verwendet. NFAs sind eine einfache Schwankung der Grammatiken des Typs 3 der Hierarchie von Chomsky.

Schließlich lohnt es sich zu bemerken, dass vieler wirklicher "regelmäßiger Ausdruck" Motoren Eigenschaften durchführt, die durch die regelmäßigen Ausdrücke im Sinne der formellen Sprachtheorie nicht beschrieben werden können; sieh unten für mehr darauf.

Das Entscheiden der Gleichwertigkeit von regelmäßigen Ausdrücken

Wie gesehen, in vielen der Beispiele oben gibt es mehr als eine Weise, einen regelmäßigen Ausdruck zu bauen, um dieselben Ergebnisse zu erreichen.

Es ist möglich, einen Algorithmus zu schreiben, der für zwei gegebene regelmäßige Ausdrücke entscheidet, ob die beschriebenen Sprachen im Wesentlichen gleich sind, reduziert jeden Ausdruck auf eine minimale deterministische Zustandsmaschine und bestimmt, ob sie isomorphe (Entsprechung) sind.

Die Überfülle kann durch das Verwenden des Sterns von Kleene und der Satz-Vereinigung beseitigt werden, um eine interessante Teilmenge von regelmäßigen Ausdrücken zu finden, die noch völlig ausdrucksvoll ist, aber vielleicht kann ihr Gebrauch eingeschränkt werden. Das ist ein überraschend schwieriges Problem. So einfach, wie die regelmäßigen Ausdrücke sind, gibt es keine Methode, sie zu einer normalen Form systematisch umzuschreiben. Der Mangel am Axiom in der Vergangenheit hat zum Sternhöhe-Problem geführt. 1991, Dexter Kozen axiomatized regelmäßige Ausdrücke mit der Algebra von Kleene.

Syntax

Mehrere spezielle Charaktere oder meta Charaktere werden verwendet, um Handlungen anzuzeigen oder Gruppen abzugrenzen; aber es ist möglich, diese speziellen Charaktere zu zwingen, als normale Charaktere durch das Vorangehen ihnen mit einem definierten Flucht-Charakter, gewöhnlich der umgekehrte Schrägstrich "\" interpretiert zu werden. Zum Beispiel wird ein Punkt normalerweise als ein "Stellenvertretersymbol" metacharacter verwendet, um jeden Charakter anzuzeigen, aber wenn vorangegangen, durch einen umgekehrten Schrägstrich vertritt es den Punktcharakter selbst. Das Muster vergleicht "Katze", "Kinderbettchen", "Kürzung" und Nichtwörter wie "czt" und "c.t"; aber Matchs nur "c.t". Der umgekehrte Schrägstrich entkommt auch sich, d. h. zwei umgekehrte Schrägstriche werden als ein wörtlicher Charakter des umgekehrten Schrägstrichs interpretiert.

POSIX

POSIX grundlegende regelmäßige Ausdrücke

Traditionelle Unix regelmäßige Ausdruck-Syntax ist allgemeiner Vereinbarung gefolgt, aber hat sich häufig vom Werkzeug bis Werkzeug unterschieden. Der IEEE POSIX Standard von Basic Regular Expressions (BRE) (ISO/IEC 9945-2:1993 Informationstechnologie - Tragbare Betriebssystemschnittstelle (POSIX) - Teil 2: Shell und Dienstprogramme, nacheinander revidiert als ISO/IEC 9945-2:2002 Informationstechnologie - Tragbare Betriebssystemschnittstelle (POSIX) - Teil 2: Systemschnittstellen, ISO/IEC 9945-2:2003, und zurzeit ISO/IEC/IEEE 9945:2009 Informationstechnologie - Tragbare Betriebssystemschnittstelle (POSIX®) Grundspezifizierungen, Ausgabe 7) wurde größtenteils für die rückwärts gerichtete Vereinbarkeit mit dem traditionellen (Einfacher Regelmäßiger Ausdruck) Syntax entworfen, aber ein allgemeiner Standard zur Verfügung gestellt, der als die Verzug-Syntax von vielen Unix regelmäßige Ausdruck-Werkzeuge seitdem angenommen worden ist, obwohl es häufig etwas Schwankung oder zusätzliche Eigenschaften gibt.

BRE wurde neben einem alternativen Geschmack genannt Verlängerte Regelmäßige Ausdrücke oder VOR veröffentlicht. Viele Unix Werkzeuge stellen auch Unterstützung für VOR der Syntax mit Befehl-Linienargumenten zur Verfügung.

In der BRE Syntax werden die meisten Charaktere als Druckfehler behandelt — sie vergleichen nur sich (z.B, Matchs). Die Ausnahmen, die unten verzeichnet sind, werden metacharacters oder metasequences genannt.

Beispiele:
  • Matchs jede Schnur-Buchstaben drei, die mit "an", einschließlich "des Huts", "der Katze" und "der Fledermaus" endet.
  • Matchs "Hut" und "Katze".
  • Matchs alle Schnuren, die durch außer "der Fledermaus" verglichen sind.
  • Matchs "Hut" und "Katze", aber nur am Anfang der Schnur oder Linie.
  • Matchs "Hut" und "Katze", aber nur am Ende der Schnur oder Linie.
  • Matchs jeder einzelne Charakter, der durch" [" und"]" seit den Klammern umgeben ist, wird zum Beispiel entkommen: und" [b]".

POSIX verlängerte regelmäßige Ausdrücke

Die Bedeutung von mit einem umgekehrten Schrägstrich entkommenem metacharacters wird für einige Charaktere in der POSIX Syntax von Extended Regular Expression (ERE) umgekehrt. Mit dieser Syntax veranlasst ein umgekehrter Schrägstrich den metacharacter, als ein wörtlicher Charakter behandelt zu werden. Also, zum Beispiel, ist jetzt und ist jetzt

Beispiele:
  • Matchs "Hut", "Katze", und "daran".
  • Matchs "Katze" oder "Hund".

POSIX Verlängerte Regelmäßige Ausdrücke kann häufig mit modernen Dienstprogrammen von Unix durch das Umfassen der Befehl-Linienfahne verwendet werden.

POSIX Charakter-Klassen

Da viele Reihen von Charakteren von der gewählten Schauplatz-Einstellung abhängen (d. h. in einigen Einstellungen Briefe als Alphabet... zABC organisiert werden... Z, während in einigen anderen als aAbBcC... zZ), der POSIX Standard definiert einige Klassen oder Kategorien von Charakteren, wie gezeigt, im folgenden Tisch:

~-] </nowiki> </Code>

| Zeichensetzungscharaktere

| -

|

||||

| Charaktere von Whitespace

| -|||||

| Non-whitespace Charaktere

| -|||||

| Großbuchstaben

| -|||||

| Ziffern von Hexadecimal

| }\

POSIX Charakter-Klassen können nur innerhalb von Klammer-Ausdrücken verwendet werden. Zum Beispiel,

Eine zusätzliche non-POSIX durch einige Werkzeuge verstandene Klasse ist, der gewöhnlich definiert wird, wie plus unterstreichen. Das widerspiegelt die Tatsache, dass auf vielen Programmiersprachen das die Charaktere sind, die in Bezeichnern verwendet werden können. Der Redakteur Vim unterscheidet weiter Wort und Worthauptklassen (die Notation verwendend, und) seitdem auf vielen Programmiersprachen die Charaktere, die beginnen können, ein Bezeichner sind nicht dasselbe als diejenigen, die in anderen Positionen vorkommen können.

Bemerken Sie, dass, was die POSIX regelmäßigen Ausdruck-Standards Charakter-Klassen nennen, allgemein POSIX Charakter-Klassen in anderen regelmäßigen Ausdruck-Geschmäcken genannt werden, die sie unterstützen. Mit den meisten anderen regelmäßigen Ausdruck-Geschmäcken wird die Begriff-Charakter-Klasse verwendet, um zu beschreiben, was POSIX Klammer-Ausdrücke nennt.

Perl-abgeleitete regelmäßige Ausdrücke

Perl hat eine konsequentere und reichere Syntax als das POSIX grundlegende (BRE) und erweitert (VOR) regelmäßigen Ausdruck-Standards. Ein Beispiel seiner Konsistenz ist, der immer einem nichtalphanumerischen Charakter entkommt. Andere Beispiele der Funktionalität, die mit Perl, aber nicht POSIX-entgegenkommenden regelmäßigen Ausdrücken möglich ist, sind das Konzept der faulen Quantifizierung (sieh die folgende Abteilung), possessiv misst, um das Zurückverfolgen, genannt Festnahme-Gruppen und rekursive Muster zu kontrollieren.

Größtenteils dank seiner ausdrucksvollen Macht haben viele andere Dienstprogramme und Programmiersprachen Syntax angenommen, die Perl — zum Beispiel, Java, JavaScript, PCRE, Pythonschlange, Rubin, das.NET Fachwerk des Microsofts und der W3C's XML Diagramm der ganze Gebrauch regelmäßige Perl ähnliche Ausdruck-Syntax ähnlich ist. Einige Sprachen und Werkzeuge wie Zunahme und PHP unterstützen vielfache regelmäßige Ausdruck-Geschmäcke. Perl-abgeleitete regelmäßige Ausdruck-Durchführungen, sind und das ganze Werkzeug nicht mehr als eine Teilmenge der Eigenschaften von Perl, gewöhnlich diejenigen von Perl 5.0, veröffentlicht 1994 nicht identisch. Mit Perl 5.10 ist dieser Prozess Vollkreis mit Perl gekommen, der syntaktische Erweiterungen ursprünglich vereinigt, die in der Pythonschlange und PCRE entwickelt sind

Einfache regelmäßige Ausdrücke

Einfache Regelmäßige Ausdrücke sind eine Syntax, die durch historische Versionen von Anwendungsprogrammen verwendet werden kann, und innerhalb von einigen Anwendungen zum Zweck unterstützt werden kann, rückwärts gerichtete Vereinbarkeit zur Verfügung zu stellen. Es wird missbilligt.

Faule Quantifizierung

Der Standard quantifiers in regelmäßigen Ausdrücken ist gierig, bedeutend, dass sie so viel zusammenpassen, wie sie können. Zum Beispiel, um das erste Beispiel eines Artikels zwischen den winkligen Klammer-Symbolen zu finden

Ein anderes Walfisch-Zielen ist darauf vorgekommen

jemand, der regexes neu ist, würde wahrscheinlich das Muster präsentieren

Obwohl dieses Problem auf mehrere Weisen vermieden werden kann (z.B, durch das Spezifizieren des Textes, der nicht verglichen werden soll:

Muster für nichtregelmäßige Sprachen

Viele in modernen regelmäßigen Ausdruck-Bibliotheken gefundene Eigenschaften stellen eine ausdrucksvolle Macht zur Verfügung, die weit die regelmäßigen Sprachen überschreitet. Zum Beispiel erlauben viele Durchführungen, Subausdrücke mit Parenthesen zu gruppieren und den Wert zurückzurufen, den sie in demselben Ausdruck vergleichen. Das bedeutet, dass ein Muster Reihen von wiederholten Wörtern wie "Papa" oder "WikiWiki", genannt Quadrate in der formellen Sprachtheorie vergleichen kann. Das Muster für diese Schnuren ist.

Die Sprache von Quadraten ist nicht regelmäßig, noch es ist ohne Zusammenhänge. Muster, das mit einer unbegrenzten Zahl von Zurückverweisungen, wie unterstützt, durch zahlreiche moderne Werkzeuge zusammenpasst, ist NP-complete (sieh Lehrsatz 6.2).

Jedoch gebrauchen viele Werkzeuge, Bibliotheken und Motoren, die solche Aufbauten noch zur Verfügung stellen, den Begriff regelmäßiger Ausdruck für ihre Muster. Das hat zu einer Nomenklatur geführt, wo der Begriff regelmäßiger Ausdruck verschiedene Bedeutungen in der formellen Sprachtheorie und dem Muster-Zusammenbringen hat. Deshalb haben einige Menschen ins Gebrauchen des Begriffs regex oder einfach Musters gebracht, um die Letzteren zu beschreiben. Larry Wall, Autor der Programmiersprache von Perl, schreibt in einem Aufsatz über das Design von Perl 6:

Krause regelmäßige Ausdrücke

Varianten von regelmäßigen Ausdrücken können verwendet werden, um mit dem Text auf natürlicher Sprache zu arbeiten, wenn es notwendig ist, mögliche Druckfehler und sich schreibende Varianten in Betracht zu ziehen. Zum Beispiel könnte der Text "Julius Caesar" ein krauses Match sein für:

  • Gaius Julius Caesar
  • Yulius Cesar
  • G. Juliy Caezar

In solchen Fällen führt der Mechanismus eine krause Schnur durch, die Algorithmus und vielleicht einen Algorithmus vergleicht, für die Ähnlichkeit zwischen Textbruchstück und Muster zu finden.

Diese Aufgabe ist nah sowohl mit der vollen Textsuche als auch mit genannten Entitätsanerkennung verbunden.

Einige Softwarebibliotheken arbeiten mit krausen regelmäßigen Ausdrücken:

  • TRE - gut entwickeltes tragbares freies Projekt in C, der Syntax verwendet, die POSIX ähnlich
ist
  • FREJ - öffnen Quellprojekt in Java mit der Sondersyntax (der Präfix, einem Lispeln ähnliche Notation verwertet), ins Visier genommen, um leichten Gebrauch von Ersetzungen von inneren verglichenen Bruchstücken in Außenblöcken zu erlauben, aber hat an vielen Eigenschaften von regelmäßigen Standardausdrücken Mangel.
  • agrep - Dienstprogramm der Befehl-Linie (Eigentums-, aber frei für den Nichthandelsbrauch).

Durchführungen und Laufzeiten

Es gibt mindestens drei verschiedene Algorithmen, die entscheiden, wenn und wie ein gegebener regelmäßiger Ausdruck eine Schnur vergleicht.

Die ältesten und schnellsten zwei verlassen sich auf ein Ergebnis in der formellen Sprachtheorie, die jedem nichtdeterministischen begrenzten Automaten (NFA) erlaubt, in einen deterministischen begrenzten Automaten (DFA) umgestaltet zu werden. Der DFA kann ausführlich gebaut und dann auf der resultierenden Eingangsschnur ein Symbol auf einmal geführt werden. Das Konstruieren des DFA für einen regelmäßigen Ausdruck der Größe M hat die Zeit und Speicherkosten von O (2), aber es kann auf einer Schnur der Größe n rechtzeitig O (n) geführt werden. Eine alternative Annäherung soll den NFA direkt vortäuschen, im Wesentlichen jeden DFA-Staat auf Verlangen bauend und dann es am nächsten Schritt verwerfend. Das behält das DFA implizite und vermeidet die Exponentialaufbaukosten, aber das Laufen von Kosten erhebt sich zu O (mn). Die ausführliche Annäherung wird den DFA Algorithmus und die implizite Annäherung den NFA Algorithmus genannt. Das Hinzufügen, das zum NFA Algorithmus versteckt, wird häufig den "faulen DFA" Algorithmus, oder gerade den DFA Algorithmus genannt, ohne eine Unterscheidung zu machen. Diese Algorithmen sind schnell, aber das Verwenden von ihnen, um gruppierte Subausdrücke, faule Quantifizierung und ähnliche Eigenschaften zurückzurufen, ist heikel.

Der dritte Algorithmus soll das Muster gegen die Eingangsschnur durch das Zurückverfolgen vergleichen. Dieser Algorithmus wird NFA allgemein genannt, aber diese Fachsprache kann verwirrend sein. Seine Laufzeit kann Exponential-sein, welche einfache Durchführungen ausstellen, wenn das Zusammenbringen gegen Ausdrücke wie das sowohl Wechsel als auch unbegrenzte Quantifizierung enthält und den Algorithmus zwingt, eine exponential steigende Zahl von Subfällen zu denken. Dieses Verhalten kann ein Sicherheitsproblem genannt die Regelmäßige Ausdruck-Leugnung des Dienstes verursachen.

Obwohl denselben Weg zurückverfolgend geben Durchführungen nur eine Exponentialgarantie im Grenzfall, sie stellen viel größere Flexibilität und ausdrucksvolle Macht zur Verfügung. Zum Beispiel muss jede Durchführung, die den Gebrauch von Rückverweisen erlaubt, oder die verschiedenen von Perl eingeführten Erweiterungen durchführt, eine Art Zurückverfolgen einschließen. Einige Durchführungen versuchen, den besten von beiden Algorithmen durch das erste Laufen eines schnellen DFA Algorithmus zur Verfügung zu stellen, und zu einem potenziell langsameren denselben Weg zurückverfolgenden Algorithmus nur zurückzukehren, wenn auf einen Rückverweis während des Matchs gestoßen wird.

Unicode

In theoretischen Begriffen kann jeder Scheinsatz durch regelmäßige Ausdrücke verglichen werden, so lange er vorherbestimmt wird. In Bezug auf historische Durchführungen wurden regelmäßige Ausdrücke ursprünglich geschrieben, um ASCII Charaktere als ihr Scheinsatz zu verwenden, obwohl regelmäßige Ausdruck-Bibliotheken viele andere Codierungen unterstützt haben. Viele moderne regelmäßige Ausdruck-Motoren bieten mindestens etwas Unterstützung für Unicode an. In vieler Hinsicht macht es keinen Unterschied, wie die Codierung ist, aber einige Probleme entstehen wirklich, wenn sie regelmäßige Ausdrücke erweitern, um Unicode zu unterstützen.

  • Unterstützte Verschlüsselung. Einige regelmäßige Ausdruck-Bibliotheken nehmen an, an etwas besonderer Verschlüsselung statt auf abstrakten Charakteren von Unicode zu arbeiten. Viele von diesen verlangen die UTF-8-Verschlüsselung, während andere UTF-16 oder UTF-32 erwarten könnten. Im Gegensatz sind Perl und Java Agnostiker auf encodings, stattdessen auf decodierten Charakteren innerlich funktionierend.
  • Unterstützte Unicode-Reihe. Viele regelmäßige Ausdruck-Motoren unterstützen nur das Grundlegende Mehrsprachige Flugzeug, d. h. die Charaktere, die mit nur 16 Bit verschlüsselt werden können. Zurzeit können nur einige regelmäßige Ausdruck-Motoren (z.B, Perl und Java) die volle 21-Bit-Reihe von Unicode behandeln.
  • Das Verlängern von ASCII-orientierten Konstruktionen zu Unicode. Zum Beispiel, in ASCII-basierten Durchführungen, sind Charakter-Reihen der Form gültig, wo auch immer x und y codepoints in der Reihe [0x00,0x7F] und codepoint (x)  codepoint (y) sind. Die natürliche Erweiterung solcher Charakter-Reihen zu Unicode würde einfach die Voraussetzung ändern, dass die Endpunkte in [0x00,0x7F] zur Voraussetzung liegen, dass sie in [0,0x10FFFF] liegen. Jedoch in der Praxis ist das häufig nicht der Fall. Einige Durchführungen, wie die des Lackels, erlauben Charakter-Reihen nicht, Blöcke von Unicode zu durchqueren. Eine Reihe wie [0x61,0x7F] ist seit beidem Endpunkt-Fall innerhalb des Grundlegenden lateinischen Blocks gültig, wie [0x0530,0x0560] seit beidem Endpunkt-Fall innerhalb des armenischen Blocks ist, aber eine Reihe wie [0x0061,0x0532] ist ungültig, da es vielfache Blöcke von Unicode einschließt. Andere Motoren, wie die des Schwung-Redakteurs, erlauben Block-Überfahrt, aber beschränken die Zahl von Charakteren in einer Reihe zu 128.
  • Fall-Gefühllosigkeit. Einige Fahnen der Fall-Gefühllosigkeit betreffen nur die ASCII Charaktere. Andere Fahnen betreffen alle Charaktere. Einige Motoren haben zwei verschiedene Fahnen, ein für ASCII, anderen für Unicode. Genau, welche Charaktere den POSIX Klassen auch gehören, ändert sich.
  • Vetter der Fall-Gefühllosigkeit. Da ASCII Fall-Unterscheidung hat, ist Fall-Gefühllosigkeit eine logische Eigenschaft in der Textsuche geworden. Unicode hat alphabetische Schriften ohne Fall wie Devanagari eingeführt. Für diese ist Fall-Empfindlichkeit nicht anwendbar. Für Schriften wie Chinesisch scheint eine andere Unterscheidung logisch: zwischen traditionellem und vereinfachtem. In arabischen Schriften kann die Gefühllosigkeit zur anfänglichen, mittleren, endgültigen und isolierten Position gewünscht werden. In Japanisch, Gefühllosigkeit zwischen hiragana und katakana ist manchmal nützlich.
  • Normalisierung. Unicode hat sich verbindende Charaktere. Wie alte Schreibmaschinen kann einfachen Briefen von einem von mehr Nichtabstand-Symbolen (gewöhnlich diakritische Zeichen wie Akzent-Zeichen) gefolgt werden, um einen einzelnen Druckcharakter zu bilden, sondern auch stellen vorzusammengesetzte Charaktere, d. h. Charaktere zur Verfügung, die bereits einen oder mehr sich verbindende Charaktere einschließen. Eine Folge eines Charakters + sich verbindender Charakter sollte mit dem identischen einzelnen vorgelassenen Charakter verglichen werden. Der Prozess, Folgen von Charakteren + sich verbindende Charaktere zu standardisieren, wird Normalisierung genannt.
  • Neue Kontrollcodes. Unicode, der unter anderen, Byte-Ordnungszeichen und Textrichtungsanschreibern eingeführt ist. Diese Codes könnten auf eine spezielle Weise befasst werden müssen.
  • Einführung von Charakter-Klassen für Blöcke von Unicode, Schriften und viele andere Charakter-Eigenschaften. Block-Eigenschaften sind viel weniger nützlich als Schrift-Eigenschaften, weil ein Block Codepunkte aus mehreren verschiedenen Schriften haben kann, und eine Schrift Codepunkte von mehreren verschiedenen Blöcken haben kann. In Perl und der Bibliothek codieren Eigenschaften der Form oder Match-Charaktere im Block X und oder Matchs Punkte nicht in diesem Block. Ähnlich, oder Matchs jeder Charakter in der armenischen Schrift. Im Allgemeinen, Matchs jeder Charakter entweder mit dem binären Eigentum X oder mit der allgemeinen Kategorie X. Zum Beispiel, oder Matchs jeder Großbuchstabe. Binäre Eigenschaften, die nicht allgemeine Kategorien sind, schließen ein, und. Beispiele von nichtbinären Eigenschaften sind, und.

Gebrauch

Regelmäßige Ausdrücke sind in der Produktion von Syntax-Hervorheben-Systemen, Datengültigkeitserklärung und vielen anderen Aufgaben nützlich.

Während regelmäßige Ausdrücke auf Suchmotoren wie Google nützlich sein würden, sie über die komplette Datenbank in einer Prozession zu gehen, konnte übermäßige Computermittel abhängig von der Kompliziertheit und dem Design des regex verbrauchen. Obwohl in vielen Fällen Systemverwalter mit Sitz in regex Abfragen innerlich führen können, bieten die meisten Suchmotoren Regex-Unterstützung zum Publikum nicht an. Bemerkenswerte Ausnahmen: Google Codesuche, Exalead.

Beispiele

Ein regelmäßiger Ausdruck ist eine Schnur, die verwendet wird, um eine Reihe von Schnuren gemäß bestimmten Syntax-Regeln zu beschreiben oder zu vergleichen. Die spezifischen Syntax-Regeln ändern sich abhängig von der spezifischen Durchführung, Programmiersprache oder Bibliothek im Gebrauch. Zusätzlich kann sich die Funktionalität von regex Durchführungen zwischen Versionen ändern.

Trotz dieser Veränderlichkeit, und weil regelmäßige Ausdrücke schwierig sein können, sowohl zu erklären als auch ohne Beispiele zu verstehen, stellt dieser Artikel eine grundlegende Beschreibung von einigen der Eigenschaften von regelmäßigen Ausdrücken über die Illustration zur Verfügung.

Die folgende Vereinbarung wird in den Beispielen verwendet.

metacharacter (s);; die metacharacters Säule gibt die regex Syntax an, die wird demonstriert

= ~ M//;; zeigt eine Regex-Match-Operation in Perl an

= ~ s;; zeigt eine regex Ersatz-Operation in Perl an

Auch wert zu bemerken ist, dass diese regelmäßigen Ausdrücke die ganze Perl ähnliche Syntax sind. Normale POSIX regelmäßige Ausdrücke sind verschieden.

Wenn sonst nicht angezeigt, passen sich die folgenden Beispiele der Programmiersprache von Perl, Ausgabe 5.8.8 am 31. Januar 2006 an. Das bedeutet, dass andere Durchführungen an Unterstützung für einige Teile der Syntax gezeigt hier (z.B grundlegend gegen verlängerten regex, \(\) gegen Mangel haben, oder \d statt POSIX [fehlen können: Ziffer:]).

Die Syntax und in diesen Beispielen verwendete Vereinbarung fallen mit dieser anderer Programmierumgebungen ebenso zusammen (z.B, sieh Java in einer Nussschale — Seite 213, Pythonschlange Scripting für die Rechenbetonte Wissenschaft — Seite 320, PHP — Seite 106 Programmierend).

Bemerken Sie, dass ganz, wenn Behauptungen einen WAHREN Wert </th> zurückgeben

</tr>

$string1 = "Hallo World\n";

wenn ($string1 = ~ m/...../) {\

Druck "$string1 hat Länge> = 5\n";

}\

</Quelle> </td>

</tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ M / (H.). (o..)/) {\

drucken Sie "Wir haben '1 $' und '2 $ '\n" verglichen;

}\

</Quelle> Produktion:

Wir haben 'Hel' und 'o W' verglichen;

</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/l +/) {\

drucken Sie "Es gibt ein oder mehr aufeinander folgender Brief \"l \"'s im $string1\n";

}\</Quelle> Produktion:

Es gibt ein oder mehr aufeinander folgender Brief "l" 's in Hallo der Welt

</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/H.? e/) {\

drucken Sie "Es gibt 'H' und einen 'e', der durch getrennt ist";

drucken Sie "0-1 Charaktere (Ab: Er Hacke) \n";

}\</Quelle> </td></tr>

als wenige Male als möglich zusammenzupassen. </td>

$string1 = "Hallo World\n";

wenn ($string1 = ~ M / (l. +? o)/) {\

drucken Sie "Das nichtgierige Match mit 'l', der von einem gefolgt ist oder";

Druck "mehr Charaktere ist 'llo' aber nicht 'llo wo '.\n";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/el*o/) {\

drucken Sie "Es gibt einen 'e', der von der Null zu vielen gefolgt ist";

drucken Sie "'l' gefolgt von 'o' (eo, elo, ello, elllo) \n";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/l {1,2}/) {\

drucken Sie "Dort besteht eine Teilkette mit mindestens 1";

drucken Sie "und höchstens 2 l's im $string1\n";

}\</Quelle></td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ M / [aeiou] +/) {\

Druck "$string1 enthält einen oder mehr Vokale \n";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ M / (Hello|Hi|Pogo)/) {\

drucken Sie "Mindestens einen Hallo Hallo, oder Pogo ist";

drucken Sie "enthalten im $string1.\n";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/llo\b/) {\

drucken Sie "Es gibt ein Wort, das mit 'llo '\n" endet;

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/\w/) {\

drucken Sie "Es gibt mindestens einen alphanumerisch";

drucken Sie "Charakter im $string1 (A-Z, a-z, 0-9, _) \n";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/\W/) {\

drucken Sie "Den Raum zwischen Hallo und";

Druck "Welt ist nicht alphanumeric\n";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/\s.*\s/) {\

drucken Sie "Es gibt ZWEI whitespace Charaktere, die können";

Druck, "durch andere Charaktere im $string1 getrennt werden";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/\S.*\S/) {\

drucken Sie "Es gibt ZWEI non-whitespace Charaktere, der";

Druck "kann durch andere Charaktere im $string1 getrennt werden";

}\</Quelle> </td></tr>

$string1 = "99 Flaschen von Bier auf der Wand.";

wenn ($string1 = ~ M / (\d +)/) {\

Druck "1 $ ist die erste Zahl im '$string1 '\n";

}\</Quelle> Produktion:

99 ist die erste Zahl in '99 Flaschen von Bier auf der Wand.'

</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/\D/) {\

drucken Sie "Es gibt mindestens einen Charakter im $string1";

drucken Sie, "der nicht eine Ziffer \n ist";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/^He/) {\

drucken Sie "$string1-Anfänge mit den Charakteren 'Er '\n";

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ m/rld$/) {\

Druck "$string1 ist eine Linie oder Schnur";

drucken Sie, "der mit 'rld '\n" endet;

}\</Quelle> </td></tr>

$string1 = "Hello\nWorld\n";

wenn ($string1 = ~ m/\AH/) {\

Druck "$string1 ist eine Schnur";

drucken Sie, "der mit 'H '\n" anfängt;

}\</Quelle> </td></tr>$string1 = "Hello\nWorld\n";

wenn ($string1 = ~ m/d\n\z/) {\

Druck "$string1 ist eine Schnur";

drucken Sie, "der mit 'd \\n '\n" endet;

}\</Quelle> </td></tr>$string1 = "Hallo World\n";

wenn ($string1 = ~ M / [^abc]/) {\

Druck "$string1 enthält einen Charakter außer";

drucken Sie "a, b, und c\n";

}\</Quelle> </td></tr>

</Tisch> </Zentrum>

Siehe auch

Referenzen

Links


Refreshable Braille-Anzeige / Roter Zwerg
Impressum & Datenschutz