Re: regexp_matches for digit

From: Steve Crawford <scrawford(at)pinpointresearch(dot)com>
To: Ramesh T <rameshparnanditech(at)gmail(dot)com>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>, Pavel Stěhule <pavel(dot)stehule(at)gmail(dot)com>
Subject: Re: regexp_matches for digit
Date: 2015-07-09 17:05:01
Message-ID: 559EA9BD.9030502@pinpointresearch.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 07/09/2015 09:24 AM, Ramesh T wrote:
> Hi,
> in oracle regexp_like(entered
> date,'[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}','i')
>
> for postgres i have regexp_matches ,But i need how to match [:digit:]
> in postgres when we pass date..?
> any help
Konsole output

The tilde operator works fine for me.

Konsole output
select '2014-05-05' ~ '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}';
?column?
----------
t

But if you are attempting to validate a date the regex is *way* too
simplistic as it will match any manner of junk:
123456-78-901234
thisisan0000-00-00invaliddate
etc.

At a minimum you need to anchor the ends with ^ and $:
'^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}$'

If you can make reasonable assumptions about date ranges you can catch
more errors with something like:
'^20[[:digit:]]{2}-[01][[:digit:]]{1}-[0123][[:digit:]]{1}$'

But trying to truly validate dates purely with a regex is more effort
than I'm willing to put in. I don't recall where I ran across this
snippet but it creates a function that ensures that the date is
acceptable to PostgreSQL without raising an error:

CREATE OR REPLACE FUNCTION is_valid_date(text)
RETURNS bool AS
'
begin
return case when $1::date is null then false else true end;
exception when others then
return false;
end;
'
LANGUAGE 'plpgsql' VOLATILE;

Cheers,
Steve

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Ramesh T 2015-07-09 17:17:58 Re: regexp_matches for digit
Previous Message Chris Mair 2015-07-09 16:51:05 Re: regexp_matches for digit