Wie funktioniert die Erlang-Mustererkennung mit regulären Ausdrücken?

7

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:

  1. 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?

  2. Gibt es in Erlang irgendwelche Arbeiten (ein EEP?), um das Problem anzugehen?

Cayle Spandon 02.11.2009, 11:12
quelle

6 Antworten

6

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%     
Rob Charlton 02.11.2009 15:35
quelle
6

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:

  • Das BEFORE sagt, dass das Makro vor der Zielfunktion ausgeführt wird (AFTER-Makro ist ebenfalls verfügbar).
  • Der match_error ist Ihr in Ihrem Modul angegebener Fehlerhandler und enthält den Code, den Sie ausführen möchten, wenn Sie eine Übereinstimmung nicht bestehen (vielleicht nichts, blockieren Sie einfach den Ausführungsfluss)
  • Dieser Ansatz hat den Vorteil, dass die Regexp-Syntax und die Optionen mit dem re -Modul vereinheitlicht werden (Verwechslung vermeiden).

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.

    
Roberto Aloi 02.11.2009 16:16
quelle
3
  1. 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.

  2. 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>

  3. EEP-Arbeit: Ich weiß es nicht.

jldupont 02.11.2009 11:35
quelle
3

Sie können das re-Modul verwenden:

%Vor%

BEARBEITEN:

%Vor%     
Zed 02.11.2009 11:29
quelle
2
  1. Erlang behandelt keine regulären Ausdrücke in Mustern.
  2. Nein.
rvirding 05.11.2009 00:22
quelle
1

Sie können bei regulären Ausdrücken keine Übereinstimmung finden, tut mir leid. Du musst also

machen %Vor%     
Alexey Romanov 02.11.2009 14:01
quelle

Tags und Links