Your terminology isn't quite right, unfortunately, which means I might be misunderstanding your problem. There are two separate things in XSLT: a pattern, also called a match pattern, which is used in the "match" attribute of xsl:template, and an expression, also called an XPath expression or select expression, used for example in the "select" attribute of instructions like xsl:apply-templates and xsl:value-of. I'm not sure which of these you mean by "match expression".
It's easy enough to match on a fixed prefix, for example
<xsl:template match="*[starts-with(name(), 'phone']">
or
<xsl:for-each select="*[starts-with(name(), 'phone']">
In a select expression you can also use a variable:
<xsl:for-each select="*[starts-with(name(), $prefix]">
In XSLT 2.0 you can also do this in a match pattern:
<xsl:template match="*[starts-with(name(), $prefix]">
However, XSLT 1.0 doesn't allow variables in match patterns.
A general point about your XML design: I think it's trying to pack too much information into the names of the elements. It would be much cleaner to use a hierarchic structure:
<person>
<phone nr="1">
<AC/>
<Exc />
<Num />
</phone>
<phone nr="2">
<AC/>
<Exc />
<Num />
</phone>
<lastName />
<firstName />
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference