Wenn ich Erlang-Programme schreibe, die Text analysieren, stoße ich oft auf Situationen, in denen ich gerne eine Musterübereinstimmung mit einem regulären Ausdruck machen würde.
Ich wünschte zum Beispiel, ich könnte so etwas machen, wobei ~ ein "made up" Operator für reguläre Ausdrücke ist:
%Vor%Ich weiß über das Modul für reguläre Ausdrücke (re), aber AFAIK können Sie Funktionen nicht aufrufen, wenn Mustererkennung oder in Wachen.
Ich wünsche auch, dass übereinstimmende Zeichenfolgen in einer Groß- und Kleinschreibung beachtet werden können. Das ist praktisch, wenn ich zum Beispiel HTTP-Header analysiere, würde ich gerne so etwas tun, wo "Str ~ {Pattern, Options}" bedeutet "Match Str gegen Pattern Pattern mit Optionen Optionen":
%Vor%Zwei Fragen:
Wie gehen Sie normalerweise nur mit Standard-Erlang um? Gibt es einen Mechanismus / Codierungsstil, der in Bezug auf Prägnanz und Lesbarkeit dem nahe kommt?
Gibt es in Erlang irgendwelche Arbeiten (ein EEP?), um das Problem anzugehen?
Sie haben wirklich keine andere Wahl, als Ihre RegExps im Voraus zu starten und dann die Ergebnisse zu vergleichen. Hier ist ein sehr einfaches Beispiel, das sich dem annähert, was ich denke, aber es leidet unter dem Makel, dass Sie die Regexps zweimal wiederholen müssen. Sie könnten dies weniger schmerzhaft machen, indem Sie ein Makro verwenden, um jeden regulären Ausdruck an einer Stelle zu definieren.
%Vor%Eine Möglichkeit könnte sein, Erlang Web-Stil Annotationen (Makros) in Kombination mit dem re Erlang-Modul zu verwenden. Ein Beispiel ist wahrscheinlich der beste Weg, dies zu veranschaulichen.
So sieht Ihr endgültiger Code aus:
%Vor%Das MATCH -Makro wird kurz vor Ihrer foo -Funktion ausgeführt. Der Ablauf der Ausführung schlägt fehl, wenn das Regexp-Muster nicht übereinstimmt.
Ihre Match-Funktion wird wie folgt deklariert:
%Vor%Bitte beachten Sie:
Weitere Informationen zu den Erlang-Webanmerkungen finden Sie hier:
und hier:
Die Software ist Open Source, daher sollten Sie ihre Annotations-Engine möglicherweise erneut verwenden.
Für die Zeichenfolge könnten Sie das Modul 're' verwenden: Danach iterieren Sie über die Ergebnismenge. Ich fürchte, es gibt keine andere Möglichkeit, dies zu tun. AFAIK: Deshalb gibt es Regexes.
Da es viele HTTP-Header geben kann, würde ich es mir überlegen, über die Ergebnismenge eine bessere Option zu wählen ( anstatt einen sehr langen Ausdruck zu schreiben). p>
EEP-Arbeit: Ich weiß es nicht.
Sie können bei regulären Ausdrücken keine Übereinstimmung finden, tut mir leid. Du musst also
machen %Vor%Tags und Links string regex erlang text-parsing