Re: Pathological regexp match
От | Alvaro Herrera |
---|---|
Тема | Re: Pathological regexp match |
Дата | |
Msg-id | 20100129042142.GF1793@alvh.no-ip.org обсуждение исходный текст |
Ответ на | Re: Pathological regexp match (Michael Glaesemann <michael.glaesemann@myyearbook.com>) |
Ответы |
Re: Pathological regexp match
|
Список | pgsql-hackers |
Michael Glaesemann wrote: > However, as you point out, Postgres doesn't appear to take this into > account: > > postgres=# select regexp_replace('oooZQoooAoooQooQooQooo', $r$(Z(Q) > [^Q]*A.*(\2))$r$, $s$X$s$); > regexp_replace > ---------------- > oooXooo > (1 row) > > postgres=# select regexp_replace('oooZQoooAoooQooQooQooo', $r$(Z(Q) > [^Q]*A.*?(\2))$r$, $s$X$s$); > regexp_replace > ---------------- > oooXooo > (1 row) I think the reason for this is that the first * is greedy and thus the entire expression is considered greedy. The fact that you've made the second * non-greedy does not ungreedify the RE ... Note the docs say: The above rules associate greediness attributes not only withindividual quantified atoms, but with branches and entire REsthatcontain quantified atoms. What that means is that thematching is done in such a way that the branch, or whole RE,matchesthe longest or shortest possible substring as a whole. It's late here so I'm not sure if this is what you're looking for: alvherre=# select regexp_replace('oooZQoooAoooQooQooQooo', $r$(Z(Q)[^Q]*?A.*(\2))$r$, $s$X$s$);regexp_replace ----------------oooXooQooQooo (1 fila) (Obviously the non-greediness has moved somewhere else) :-( -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
В списке pgsql-hackers по дате отправления: