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.
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>] *)> ``, 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 "True" 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 "einfache" 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 "besser" 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
zubcb
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 = "/" ``. Dann können Sie `` / w + / w + /. / W + `` schreiben, sieht ungewöhnlich aus, ist aber lesbarer.