Re: Why this regexp matches?!

Поиск
Список
Период
Сортировка
От David Johnston
Тема Re: Why this regexp matches?!
Дата
Msg-id 8887FCC5-2FC2-4609-B1FC-11EB81F01B86@yahoo.com
обсуждение исходный текст
Ответ на Re: Why this regexp matches?!  (hubert depesz lubaczewski <depesz@depesz.com>)
Список pgsql-general
On Feb 4, 2012, at 3:58, hubert depesz lubaczewski <depesz@depesz.com> wrote:

> On Sat, Feb 04, 2012 at 09:54:34AM +0100, Szymon Guz wrote:
>> On 4 February 2012 09:46, hubert depesz lubaczewski <depesz@depesz.com>wrote:
>>
>>> select 'depesz depeszx depesz' ~ E'^(.*)( \\1)+$';
>>>
>>> what's worse:
>>> $ select regexp_replace( 'depesz depeszx depesz', E'^(.*)( \\1)+$', E'\\1'
>>> );
>>> regexp_replace
>>> ────────────────
>>> depesz
>>> (1 row)
>>>
>>> I know that Pg regexps are limited, but even grep's regexps match this
>>> correctly:
>>>
>>> =$ printf 'depesz depesz depesz\ndepesz depeszx depesz\n' | grep -E
>>> '^(.*)( \1)+$';
>>> depesz depesz depesz
>>>
>>> Best regards,
>>>
>>> depesz
>>>
>>>
>> Hi,
>> some time ago I hit the same problem, however the solution was a little bit
>> tricky. I didn't have time to investigate it, but this works:
>>
>> postgres@postgres:5840=#  select regexp_replace( 'depesz depeszx depesz',
>> E'^(.*)( \\\\1)+$', E'\\\\1' );
>>    regexp_replace
>> -----------------------
>> depesz depeszx depesz
>> (1 row)
>
> not sure if I understand your point.
>
> This regexp was meant to find repeated substrings.
>
> Like this one does in perl:
>
> /^(.*)( \1)+$/
>
> We can see how it works with:
> =$ perl -e 'if ( shift =~ m/^(.*)( \1)+$/ ) { print "is repeat of [$1]\n" } else {print "is not repeated\n"}' 'depesz
depeszdepesz' 
> is repeat of [depesz]
>
> =$ perl -e 'if ( shift =~ m/^(.*)( \1)+$/ ) { print "is repeat of [$1]\n" } else {print "is not repeated\n"}' 'depesz
depeszxdepesz' 
> is not repeated
>
> reason why your regexp matches is also a mystery for me.
>
> Best regards,
>
> depesz
>
>

Don't know the answer (if there is one other than 'it's a bug') but as a workaround you can split the string on
whitespacethen perform grouping and see if more than one record results... 

David J.

В списке pgsql-general по дате отправления:

Предыдущее
От: "mike@trausch.us"
Дата:
Сообщение: Re: debugging the server[ module causes server cash]
Следующее
От: Tom Lane
Дата:
Сообщение: Re: debugging the server[ module causes server cash]