Englisch Русский Deutsch Български Français Español

FAQ

Ich habe einen schrecklichen Fehler gefunden: TRegExpr löst Zugriffsverletzung aus!

Antworten

Sie müssen das Objekt vor der Verwendung erstellen. Nachdem Sie also etwas erklärt haben:

r: TRegExpr

Vergessen Sie nicht, die Objektinstanz zu erstellen:

r: = TRegExpr.Create.

Reguläre Ausdrücke mit (? = …) funktionieren nicht

Look Ahead ist in TRegExpr nicht implementiert. In vielen Fällen können Sie sie jedoch durch einfache Unterausdrücke leicht ersetzen.

Unterstützt es Unicode?

Antworten

`Wie verwende ich Unicode? <tregexpr.html#unicode> __

Warum gibt TRegExpr mehr als eine Zeile zurück?

Zum Beispiel gibt re `` <font .*>`` das erste `` zurück</font> <font``, then the rest of the file including last </html> <font .\*>.</font>.

Antworten

Für Rückwärtskompatibilität Modifier / s ist standardmäßig` Ein`.

Schalten Sie es aus und . passt zu allen anderen als 'Trennzeichen' <regular_expressions.html#syntax_line_separators> __ - genau wie Sie es wünschen.

Übrigens empfehle ich `` <font ([^n>] *)&gt; ``, in `` Match [1] `` wird die URL.</font>.

Warum gibt TRegExpr mehr als ich erwarte?

Zum Beispiel: `` <p> (. +) </p> `` auf String `` angewendet <p> ein </p><p> b </p> `` gibt `` a zurück </p><p> b`` aber nicht a wie ich erwartet hatte.

Antworten

Standardmäßig arbeiten alle Operatoren im gierigen Modus, so dass sie so weit wie möglich zusammenpassen.

Wenn Sie den nicht-gierigen Modus wollen, können Sie `` nicht-gierige`'-Operatoren wie +? Usw. verwenden, oder alle Operatoren mit Hilfe des Modifikators `` `g (verwenden Sie die entsprechenden TRegExpr-Eigenschaften oder den Operator` ? (- g) `in re).

Wie kann man mit TRegExpr Quellen wie HTML analysieren?

Antworten

Sorry Leute, aber es ist fast unmöglich!

Natürlich können Sie TRegExpr problemlos zum Extrahieren einiger Informationen aus HTML verwenden, wie in meinen Beispielen gezeigt. Wenn Sie jedoch eine genaue Analyse wünschen, müssen Sie einen echten Parser verwenden, nicht re.

Die vollständige Erklärung finden Sie beispielsweise in Tom Christiansen und Nathan Torkington, `` Perl Cookbook``.

Kurz gesagt, es gibt viele Strukturen, die mit echtem Parser einfach geparst werden können, von re aber gar nicht, und realer Parser ist beim Parsing viel schneller, da re nicht nur den Eingabestrom scannt, sondern eine Optimierungssuche ausführt, die dauern kann viel Zeit.

Gibt es eine Möglichkeit, mehrere Übereinstimmungen eines Musters auf TRegExpr abzurufen?

Antworten

Sie können Übereinstimmungen mit der ExecNext-Methode wiederholen.

Wenn Sie ein Beispiel wünschen, werfen Sie einen Blick auf die Implementierung der TRegExpr.Replace`-Methode oder auf die Beispiele für` HyperLinksDecorator <demos.html> _

Ich überprüfe die Benutzereingaben. Warum gibt TRegExpr für falsche Eingabezeichenfolgen &quot;True&quot; zurück?

Antworten

In vielen Fällen vergessen TRegExpr-Benutzer, dass reguläre Ausdrücke für ** Suche ** in der Eingabezeichenfolge sind.

Wenn Sie beispielsweise `` d {4,4} `` Ausdruck verwenden, erhalten Sie Erfolg bei falschen Benutzereingaben wie 12345 oder `` any letters 1234``.

Sie müssen vom Anfang der Zeile bis zum Ende der Zeile überprüfen, um sicherzustellen, dass nichts anderes vorhanden ist: `` ^ d {4,4} $ ``.

Warum funktionieren nichtgierige Iteratoren manchmal wie im gierigen Modus?

Zum Beispiel entspricht das re a+?,b+?, Das auf den String aaa,bbb angewendet wird, aaa,b, sollte aber nicht mit a,b wegen Nicht-Gier passen des ersten Iterators?

Antworten

Dies liegt an TRegExprs Arbeitsweise. Tatsächlich arbeiten viele andere re-Engines genau gleich: Sie führen nur eine &quot;einfache&quot; Suchoptimierung durch und versuchen nicht, die beste Optimierung zu erreichen.

In manchen Fällen ist es schlecht, aber im Allgemeinen ist es aus Gründen der Leistung und Vorhersagbarkeit eher ein Vorteil als eine Einschränkung.

Die Hauptregel - versuchen Sie zuerst, vom aktuellen Ort aus zu passen. Nur wenn dies völlig unmöglich ist, bewegen Sie sich um ein Zeichen vorwärts und versuchen Sie es erneut von der nächsten Position im Text.

Wenn Sie also a,b+? Wird es a,b passen. Im Falle von a+?,b+? Wird es jetzt nicht empfohlen (wir fügen einen nicht-gierigen Modifikator hinzu), aber es ist immer noch möglich, mehr als einen a zu finden, also macht TRegExpr dies.

TRegExpr wie Perl oder Unix versucht nicht, sich vorwärts zu bewegen und zu prüfen - würde es &quot;besser&quot; passen. Fisrt von allem, nur weil es keine Möglichkeit gibt zu sagen, dass es mehr oder weniger gut passt.

Wie kann ich TRegExpr mit Borland C ++ Builder verwenden?

Ich habe ein Problem, da keine Header-Datei (.h oder .hpp) verfügbar ist.

Antworten

  • Fügen Sie RegExpr.pas zu bcb hinzu.
  • Projekt kompilieren Dadurch wird die Header-Datei RegExpr.hpp generiert.
  • Jetzt können Sie Code schreiben, der die RegExpr-Einheit verwendet.
  • Vergessen Sie nicht, `` #include “RegExpr.hpp” `` bei Bedarf hinzuzufügen.
  • Vergessen Sie nicht, alle \ in regulären Ausdrücken durch \\ oder neu definierte `EscChar zu ersetzen <tregexpr.html#escchar> __ const.

Warum arbeiten viele (einschließlich TRegExpr-Hilfe und -Demo) in Borland C ++ Builder falsch?

Antworten

Der Hinweis ist in der vorherigen Frage;) Das Symbol \ hat eine besondere Bedeutung in `` C ++ , also müssen Sie es ``entkommen (wie in der vorherigen Antwort beschrieben). Wenn Sie nicht gerne \\w + \\\\ w + \\. \\ w + `` mögen, können Sie die Konstante ``EscChar (in RegExpr.pas) neu definieren. Zum Beispiel `` EscChar = &quot;/&quot; ``. Dann können Sie `` / w + / w + /. / W + `` schreiben, sieht ungewöhnlich aus, ist aber lesbarer.