[asterisk-dev] CID match uses "shortest prefix match"

Jared Smith jsmith at digium.com
Tue Mar 17 16:09:30 CDT 2009


----- "Klaus Darilion" <klaus.mailinglists at pernau.at> wrote:
> Of course this is ambiguous, actualla how is Asterisk sorting such 
> extensions?
> 
> With
> exten => _123.,1,NoOp(Matches 3 digits using 16 bytes of pattern)
> exten => _XXXX.,1,NoOp(Matches 5+ digits using only 7 bytes of
> pattern)


Here's my understanding of how the pattern matching works in Asterisk.  (And if I'm wrong, please correct me, as I've been working on this for a while now.)  There are four simple rules to follow:

1) Go digit by digit from left to right

2) See if the dialed digit matches the current digit in the pattern.  If there's not a match, exclude this pattern.  If there is a match, only advanced the pattern(s) with the lowest number of possibilities in the match.  If two or more patterns have the same number of possibilities, order them in ASCII sorting order.

3) Move on to the next digit.

4) When you've evaluated every digit, take the pattern on the top and execute that extension.


Now that we've enumerated the rules, let's look as a couple of examples...

exten => _NXX,1,NoOp(Option 1)
exten => _[1-3]XX,1,NoOp(Option 2)

In this case, if the caller dialed 333, Option 2 would be matched, as the [1-3] is more constrained (has fewer possibilities) than the N.  Let's look at on more example:

exten => _NXX,1,NoOp(Option 3)
exten => _[1-8],1,NoOp(Option 4)

This one is a bit trickier, as the N has eight possibilities (2 through 9), and so does the [1-8].  Because 1 comes before N in ASCII sorting order, it doing to get matched (again, assuming the caller dials 333).

Hopefully, that clarifies things for those who were confused about how Asterisk does its pattern matching.  (And yes, this really should be documented somewhere inside of Asterisk, such as the default extensions.conf file or a file in the doc/ subdirectory of the source code.)

---
Jared Smith
Training Manager
Digium, Inc.



More information about the asterisk-dev mailing list