Regular Expressions

Mit unserem bisherigen Wissen müssen wir pro möglicher Rufnummer immer eine eigene Extension schreiben. Dies würde schon nach kurzer Zeit sehr lange und fehleranfällige Dialpläne nach sich ziehen. Sollen z.B. die Rufnummern 100 bis 109 jeweils immer den hello-world Sprachbaustein abspielen, so würde die extensions.conf wie folgt aussehen:

[general]

[apfelmus]
exten => 100,1,Answer()
exten => 100,2,Playback(hello-world)
exten => 100,3,Hangup()

exten => 101,1,Answer()
exten => 101,2,Playback(hello-world)
exten => 101,3,Hangup()

exten => 102,1,Answer()
exten => 102,2,Playback(hello-world)
exten => 102,3,Hangup()

exten => 103,1,Answer()
exten => 103,2,Playback(hello-world)
exten => 103,3,Hangup()

exten => 104,1,Answer()
exten => 104,2,Playback(hello-world)
exten => 104,3,Hangup()

exten => 105,1,Answer()
exten => 105,2,Playback(hello-world)
exten => 105,3,Hangup()

exten => 106,1,Answer()
exten => 106,2,Playback(hello-world)
exten => 106,3,Hangup()

exten => 107,1,Answer()
exten => 107,2,Playback(hello-world)
exten => 107,3,Hangup()

exten => 108,1,Answer()
exten => 108,2,Playback(hello-world)
exten => 108,3,Hangup()

exten => 109,1,Answer()
exten => 109,2,Playback(hello-world)
exten => 109,3,Hangup()

Unter Verwendung einer Regular Expression

[Tipp]

Definition Regular Expression:

"Reguläre Ausdrücke (Abk. RegExp oder Regex, engl. regular expressions) dienen der Beschreibung von (Unter-)Mengen von Zeichenketten mit Hilfe syntaktischer Regeln. Sie finden vor allem in der Softwareentwicklung Verwendung; für fast alle Programmiersprachen existieren Implementierungen." (zitiert aus http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck )

sieht der gleiche Dialplan gleich viel handlicher aus:

[general]

[apfelmus]
exten => _10X,1,Answer()
exten => _10X,2,Playback(hello-world)
exten => _10X,3,Hangup()

Syntax

Eine Regular Expression wird immer mit einem Unterstrich (_) vor dem eigentlichen Pattern (Suchmuster) eingeleitet:

exten => _Regular Expression,Prioritaet,Applikation

Eine Regular Expression kann in Asterisk aus den folgenden Elementen[43] bestehen:

[ABC]

Die Ziffern A, B und C. Beispiel für die Zahlen 34, 37 und 38:

exten => _3[478],1,NoOp(Test)
[A-B]

Beliebige Ziffer von A bis B. Beispiel für alle Zahlen von 31 bis 35:

exten => _3[1-5],1,NoOp(Test)

(z.B. auch [25-8] möglich für die Ziffern 2,5,6,7,8)

X

Beliebige Ziffer von 0 bis 9. Beispiel für alle Zahlen von 300 bis 399:

exten => _3XX,1,NoOp(Test)
Z

Beliebige Ziffer von 1 bis 9. Beispiel für alle Zahlen von 31 bis 39:

exten => _3Z,1,NoOp(Test)
N

Beliebige Ziffer von 2 bis 9. Beispiel für alle Zahlen von 32 bis 39:

exten => _3N,1,NoOp(Test)
.

Eine oder mehrere beliebige Ziffer(n). Beispiel für alle Nummer, die mit einer 0 beginnen:

exten => _0.,1,NoOp(Test)
[Anmerkung]

Das Pattern _. sollten Sie nicht verwenden! Es trifft auch auf besondere Extensions wie i, t oder h zu. Benutzen Sie stattdessen _X. oder _X falls nötig.

!

Eine oder mehrere beliebige Ziffer(n) - ab Asterisk 1.4. Dieser besondere Platzhalter trifft zu, sobald unzweifelhaft nicht eine andere explizite Nummer im Dialplan gewählt wird. Hebt dann sofort die Leitung ab für „overlap dialing“. Hier nur der Vollständigkeit halber erwähnt.

Wann matcht welches Pattern?

Pattern Matchin in Asterisk ist bei großen Dialplänen eine trickreiche Angelegenheit. Asterisk geht nämlich nicht wie allgemein angenommen wird plump von oben nach unten den Dialplan durch. Nein, es priorisiert innerhalb der Patterns!

Je exakter ein Pattern matcht, desto höher ist die Wahrscheinlichkeit das es matcht. Asterisk geht allerdings - bevor es eine Entscheidung trifft - den ganzen Context durch. Es könnte ja sein, das ein anderes Pattern noch besser matcht.

Beispiel:

[verkauf]
exten => _12X.,1,NoOp{12X}
exten => 12345,1,NoOp(12345}
exten => _1234.,1,NoOp{1234.}

Wenn in diesem Beispiel die 12345 gewählt wird, dann wird die zweite Zeile ausgeführt, denn sie stellt den optimalen Treffer da. Wenn die 12346 gewählt wird, dann trifft die letzte Zeile, denn sie matcht besser als die erste.

[Warnung]

Es gibt eine Sonderregel für das Pattern _.

"_." matcht immer und hat auch immer die höchste Priorität. Es ist also egal, was Sie sonst noch in diesem Context für Regeln haben! Es wird immer nur die Regel mit dem Pattern "_." ausgeführt. Man sollte also lieber ein "_X." nehmen, ausser man ist sich absolut sicher und weiss was das Pattern "_." bewirkt.

Auch wenn die Reihenfolge von Pattern nicht immer ganz trival ist, gibt es eine einfache Debugging Möglichkeit. Mit show dialplan 12345@verkauf lässt sich der Dialplan für die gewählte Nummer 12345 im Context verkauf auflisten. So kann man für spezielle Nummern überprüfen, ob auch die dafür vorgesehene Regel matcht.



[43] Es gibt noch weitere Elemente, die im deutschen Sprachraum aber im Allgemeinen wenig Sinn machen. Aus diesem Grund werden sie hier nicht aufgeführt.