A variation of the expression by @Gumbo that makes use of \K for resetting match positions to prevent the inclusion of number blocks in the match. Usable in PCRE regex flavours.
For example, ab|de would match either side of the expression. However, for something like your case you might want to use the ? quantifier, which will match the previous expression exactly 0 or 1 times (1 times preferred; i.e. it's a "greedy" match). Another (probably more relyable) alternative would be using a custom character group:
to capture a match between start and the first occurrence of end. Notice how the subexpression with nested parentheses spells out a number of alternatives which between them allow e only if it isn't followed by nd and so forth, and also take care to cover the empty string as one alternative which doesn't match whatever is disallowed at that ...
28 PEP 622 provides an in-depth explanation for how the new match-case statements work, what the rationale is behind them, and provides examples where they're better than if statements. In my opinion the biggest improvement over if statements is that they allow for structural pattern matching, as the PEP is named.
The value of the match attribute of the <xsl:template> instruction must be a match pattern. Match patterns form a subset of the set of all possible XPath expressions. The first, natural, limitation is that a match pattern must select a set of nodes. There are also other limitations. In particular, reverse axes are not allowed in the location steps (but can be specified within the predicates ...