| PostgreSQL Reference Manual - Volume 1 - SQL Language Reference by The PostgreSQL Global Development Group Paperback (6"x9"), 716 pages ISBN 0954612027 RRP £32.00 ($49.95) Sales of this book support the PostgreSQL project! Get a printed copy>>> |
7.7.3.5 Regular Expression Matching Rules
In the event that an RE could match more than one substring of a given string, the RE matches the one starting earliest in the string. If the RE could match more than one substring starting at that point, either the longest possible match or the shortest possible match will be taken, depending on whether the RE is greedy or non-greedy.
Whether an RE is greedy or not is determined by the following rules:
- Most atoms, and all constraints, have no greediness attribute (because they cannot match variable amounts of text anyway).
- Adding parentheses around an RE does not change its greediness.
-
A quantified atom with a fixed-repetition quantifier
(
{m}or{m}?) has the same greediness (possibly none) as the atom itself. -
A quantified atom with other normal quantifiers (including
{m,n}with m equal to n) is greedy (prefers longest match). -
A quantified atom with a non-greedy quantifier (including
{m,n}?with m equal to n) is non-greedy (prefers shortest match). -
A branch--that is, an RE that has no top-level
|operator--has the same greediness as the first quantified atom in it that has a greediness attribute. -
An RE consisting of two or more branches connected by the
|operator is always greedy.
The above rules associate greediness attributes not only with individual quantified atoms, but with branches and entire REs that contain quantified atoms. What that means is that the matching is done in such a way that the branch, or whole RE, matches the longest or shortest possible substring as a whole. Once the length of the entire match is determined, the part of it that matches any particular subexpression is determined on the basis of the greediness attribute of that subexpression, with subexpressions starting earlier in the RE taking priority over ones starting later.
An example of what this means:
SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');
Result: 123
SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
Result: 1
In the first case, the RE as a whole is greedy because Y*
is greedy. It can match beginning at the Y, and it matches
the longest possible string starting there, i.e., Y123.
The output is the parenthesized part of that, or 123.
In the second case, the RE as a whole is non-greedy because Y*?
is non-greedy. It can match beginning at the Y, and it matches
the shortest possible string starting there, i.e., Y1.
The subexpression [0-9]{1,3} is greedy but it cannot change
the decision as to the overall match length; so it is forced to match
just 1.
In short, when an RE contains both greedy and non-greedy subexpressions, the total match length is either as long as possible or as short as possible, according to the attribute assigned to the whole RE. The attributes assigned to the subexpressions only affect how much of that match they are allowed to “eat” relative to each other.
The quantifiers {1,1} and {1,1}?
can be used to force greediness or non-greediness, respectively,
on a subexpression or a whole RE.
Match lengths are measured in characters, not collating elements.
An empty string is considered longer than no match at all.
For example:
bb*
matches the three middle characters of abbbc;
(week|wee)(night|knights)
matches all ten characters of weeknights;
when (.*).*
is matched against abc the parenthesized subexpression
matches all three characters; and when
(a*)* is matched against bc
both the whole RE and the parenthesized
subexpression match an empty string.
If case-independent matching is specified,
the effect is much as if all case distinctions had vanished from the
alphabet.
When an alphabetic that exists in multiple cases appears as an
ordinary character outside a bracket expression, it is effectively
transformed into a bracket expression containing both cases,
e.g. x becomes [xX].
When it appears inside a bracket expression, all case counterparts
of it are added to the bracket expression, e.g.
[x] becomes [xX]
and [^x] becomes [^xX].
If newline-sensitive matching is specified, .
and bracket expressions using ^
will never match the newline character
(so that matches will never cross newlines unless the RE
explicitly arranges it)
and ^and $
will match the empty string after and before a newline
respectively, in addition to matching at beginning and end of string
respectively.
But the ARE escapes \A and \Z
continue to match beginning or end of string only.
If partial newline-sensitive matching is specified,
this affects . and bracket expressions
as with newline-sensitive matching, but not ^
and $.
If inverse partial newline-sensitive matching is specified,
this affects ^ and $
as with newline-sensitive matching, but not .
and bracket expressions.
This isn't very useful but is provided for symmetry.
| ISBN 0954612027 | PostgreSQL Reference Manual - Volume 1 - SQL Language Reference | See the print edition |