Обсуждение: BUG #8605: Regular expression lazy quantification issue
The following bug has been logged on the website:
Bug reference: 8605
Logged by: Atori
Email address: atoriwork@gmail.com
PostgreSQL version: 9.2.4
Operating system: Debian 4.7.2-5, 64-bit
Description:
Lazy quantificators does't work after "or" block in regexp mask
('(a)|(b)'):
example:
string: 'CsssQsDpppppQsDpppQ'
mask: '((a)|(C.+?Q))s(D.+?Q)'
select regexp_replace('CsssQsDpppppQsDpppQ', '((C.+?Q))s(D.+?Q)', '#foo#');
result: "#foo#sDpppQ"
select regexp_replace('CsssQsDpppppQsDpppQ', '((a)|(C.+?Q))s(D.+?Q)',
'#foo#');
result: "#foo#"
expected result: "#foo#sDpppQ"
atoriwork@gmail.com writes:
> Lazy quantificators does't work after "or" block in regexp mask
> ('(a)|(b)'):
This isn't a bug, it's documented behavior. See
http://www.postgresql.org/docs/9.2/static/functions-matching.html#POSIX-MATCHING-RULES
specifically the bit that an RE containing an | operator is always greedy.
The non-greedy operators within it are constrained to match as little
as possible, but that happens after determining the overall match, which
will be greedy.
I realize that this might not be the behavior you'd like, but we're
unlikely to change it.
regards, tom lane