Warum kann nicht reguläre Ausdrücke verwenden Schlüsselwörter anstelle von Zeichen?

StackOverflow https://stackoverflow.com/questions/629573

  •  08-07-2019
  •  | 
  •  

Frage

Okay, ich verstehe kaum RegEx Grundlagen, aber warum konnten sie nicht entwerfen sie Keywords zu verwenden (wie SQL) anstelle von einigen kryptischen Wildcard Zeichen und Symbole?

Ist es für die Leistung, da der RegEx interpretiert / zur Laufzeit analysiert? (Nicht kompiliert)

Oder vielleicht für die Geschwindigkeit des Schreibens? Bedenkt man, dass, wenn Sie einige „einfache“ Zeichenkombinationen lernen es einfacher wird, ein Zeichen anstelle eines Stichwort eingeben?

War es hilfreich?

Lösung

Sie wirklich wollen, das

Pattern findGamesPattern = Pattern.With.Literal(@"<div")
    .WhiteSpace.Repeat.ZeroOrMore
    .Literal(@"class=""game""").WhiteSpace.Repeat.ZeroOrMore.Literal(@"id=""")
    .NamedGroup("gameId", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal(@"-game""")
    .NamedGroup("content", Pattern.With.Anything.Repeat.Lazy.ZeroOrMore)
    .Literal(@"<!--gameStatus")
    .WhiteSpace.Repeat.ZeroOrMore.Literal("=").WhiteSpace.Repeat.ZeroOrMore
    .NamedGroup("gameState", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal("-->");

Ok, aber es Ihre Beerdigung ist, Mann.

Laden Sie die Bibliothek, die das hier tut:
http://flimflan.com/blog/ReadableRegularExpressions.aspx

Andere Tipps

Reguläre Ausdrücke haben einen mathematischen (eigentlich Sprachtheorie) Hintergrund und codieren ein wenig wie eine mathematische Formel . Sie können sie durch eine Reihe von Regeln, zum Beispiel

definieren
  • jedes Zeichen ist ein regulärer Ausdruck, was sich
  • wenn a und b sind reguläre Ausdrücke, dann a?, a|b und ab sind reguläre Ausdrücke, zu
  • ...

Mit einer keyword-basierten Sprache eine große Belastung für die einfache reguläre Ausdrücke sein würde. Die meiste Zeit, werden Sie nur eine einfache Textzeichenfolge als Suchmuster verwenden:

grep -R 'main' *.c

Oder vielleicht sehr einfaches Muster:

grep -c ':-[)(]' seidl.txt

Wenn Sie reguläre Ausdrücke gewöhnt haben, ist diese Syntax sehr klar und präzise. In komplizierteren Situationen werden Sie wahrscheinlich etwas anderes verwenden, da ein großer regulärer Ausdruck zu lesen offensichtlich hart ist.

Perl 6 einen ziemlich revolutionären Schritt nach vorn in regex Lesbarkeit nimmt. Betrachten Sie eine Adresse in der Form: 100 E Main St Springfield MA 01234

Hier ist ein mäßig lesbares Perl 5 kompatibel regex, dass (viele Eckfällen nicht behandelt) zu analysieren:

 m/
     ([1-9]\d*)\s+
     ((?:N|S|E|W)\s+)?
     (\w+(?:\s+\w+)*)\s+
     (ave|ln|st|rd)\s+
     ([:alpha:]+(?:\s+[:alpha:]+)*)\s+
     ([A-Z]{2})\s+
     (\d{5}(?:-\d{4})?)
  /ix;

Dieses Perl 6 regex hat das gleiche Verhalten:

grammar USMailAddress {
     rule  TOP { <addr> <city> <state> <zip> }

     rule  addr { <[1..9]>\d* <direction>?
                  <streetname> <streettype> }
     token direction { N | S | E | W }
     token streetname { \w+ [ \s+ \w+ ]* }
     token streettype {:i ave | ln | rd | st }
     token city { <alpha> [ \s+ <alpha> ]* }
     token state { <[A..Z]>**{2} }
     token zip { \d**{5} [ - \d**{4} ]? }
  }

Ein Perl 6 Grammatik ist eine Klasse, und die Token sind alle aufrufbaren Methoden. Verwenden Sie es wie folgt aus:

if $addr ~~ m/^<USMailAddress::TOP>$/ {
     say "$<city>, $<state>";
}

Dieses Beispiel stammt aus einem Gespräch rel="nofollow ich im =“ http://www.frozen-perl.org/mpw2009/“rel = "nofollow noreferrer"> gefroren Perl 2009 Werkstatt. Die Rakudo Implementierung von Perl 6 ist vollständig genug, dass dieses Beispiel heute funktioniert.

Nun, wenn Sie Schlüsselwörter hatten, wie würden Sie sie leicht unterscheiden von tatsächlich gefundenen Text? Wie würden Sie Leerzeichen umgehen?

Quelltext Firma: A Abt .: B

Standard regex:

Company:\s+(.+)\s+Dept.:\s+(.+)

Oder auch:

Company: (.+) Dept. (.+)

Keyword regex (versuche wirklich schwer, nicht einen strawman bekommen ...)

"Company:" whitespace.oneplus group(any.oneplus) whitespace.oneplus "Dept.:" whitespace.oneplus group(any.oneplus)

oder vereinfacht:

"Company:" space group(any.oneplus) space "Dept.:" space group(any.oneplus)

Nein, es ist wahrscheinlich nicht besser.

Weil es zu formaler Sprachtheorie und ihre mathematischen Notation entspricht.

Es ist Perl schuld ...!

Eigentlich, genauer gesagt, kommen Reguläre Ausdrücke von den frühen Unix-Entwicklung und prägnante Syntax war viel höher dann bewertet. Lagerung, Verarbeitung Zeit, physisches Terminals, etc. waren alle sehr begrenzt, und nicht anders als heute.

Die Geschichte der Regulären Ausdrücke auf Wikipedia mehr erklärt.

Es gibt Alternativen zu Regex, aber ich bin nicht sicher, ob jeder wirklich hat gefangen.

EDIT: Berichtigt durch John Saunders: Reguläre Ausdrücke waren volkstümlich von Unix, aber zunächst durch die QED Editor. Die gleichen Konstruktionsbedingungen angewandt, um so mehr, zu früheren Systemen.

Eigentlich nicht, hat die Welt nicht mit Unix beginnen. Wenn Sie den Wikipedia-Artikel lesen, werden Sie sehen, dass

  

In den 1950er Jahren Mathematiker Stephen Cole Kleene beschrieb diese Modelle seiner mathematischen Notation mit regulären Sets genannt. Die SNOBOL Sprache war eine frühe Umsetzung von Pattern-Matching, aber nicht identisch mit regulären Ausdrücken. Ken Thompson gebaut Kleenes Notation in den Editor QED als Mittel Muster in Textdateien entsprechen. Er fügte hinzu, später diese Fähigkeit in den Editor ed Unix, die schließlich zu dem beliebten Suchwerkzeug grep Verwendung von regulären Ausdrücken führten

Das ist viel früher als PERL. Der Wikipedia-Eintrag zu regulären Ausdrücken die ersten Implementierungen von regulären Ausdrücken zu Ken Thompson von UNIX-Attribute Ruhm, der sie in der QED umgesetzt und dann der ed Editor. Ich denke, dass die Befehle kurze Namen aus Performance-Gründen hatten, aber viel vor Client-Seite ist. Reguläre Ausdrücke ein großes Buch über reguläre Ausdrücke ist, die die Möglichkeit bietet, einen regulären Ausdruck (mit / x zu annotieren Flag), um es einfacher zu lesen und zu verstehen.

Da die Idee von regulären Ausdrücken - wie viele Dinge, die von UNIX stammen - ist, dass sie kurz und bündig sind, Kürze über die Lesbarkeit begünstigt. Das ist eigentlich eine gute Sache. Ich habe reguläre Ausdrücke endet schriftlich (wider besseres Wissen), die 15 Zeilen lang sind. Wenn das eine ausführliche Syntax hätte es nicht ein regulärer Ausdruck sein, wäre es ein Programm sein.

Es ist eigentlich ziemlich einfach, eine „wortreiche“ Form von Regex zu implementieren - bitte meine Antwort sehen hier . Auf den Punkt gebracht:. Eine Handvoll Funktionen schreiben, die regulären Ausdrücke (und nehmen Parameter falls erforderlich) zurückkehren

Ich glaube nicht, Schlüsselwörter keinen Nutzen geben würde. Reguläre Ausdrücke als solche sind komplex, aber auch sehr mächtig.

Was ich denke, ist eher verwirrend ist, dass jede Unterstützung Bibliothek ihre eigene Syntax anstelle von (oder Erweiterung), um den klassischen Perl regex (zB \ 1, $ 1, {1}, ... für den Ersatz und viele weitere Beispiele) erfindet .

Ich weiß, dass seine Frage den falschen Weg, um zu antworten, aber RegexBuddy verfügt über eine Funktion, die Ihre regexpression erklärt in reinem Englisch. Dies könnte es ein bisschen leichter zu erlernen.

Wenn die ausgewählte Sprache unterstützt Posix verwenden Regexes , können Sie sie verwenden.

Ein Beispiel:

\d

wäre die gleiche wie

[:digit:]

Die Klammer-Notation ist viel klarer, was es ist, übereinstimmt. Ich würde immer noch die „kryptischen Platzhalter Zeichen und Symbole lernen, da man sie noch in anderen Leuten Code sehen und muß sie verstehen.

Es gibt weitere Beispiele in der Tabelle rel="nofollow auf regular-expressions.info Seite .

Aus irgendeinem Grund habe meine Antwort gelöscht. Wie dem auch sei, ich Sache Rubin regexp Maschine würde passen die Rechnung, unter http://www.rubyregexp.sf.net . Es ist mein eigenes Projekt, aber ich denke, es sollte funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top