2016-03-06 57 views
2

如何用一个空间替换1990-2050年的任何一年?Postgresql regexp_replace

我可以代替任意4位数字如下

select regexp_replace('sdfg 2000', '(\y(\d{4})\y)', '', 'g');

但我怎么还可以检查范围是多少? 任何帮助,欢迎

+0

与正则表达式我不认为你可以。因为限制第一位数字为'1'和'2'是可能的。但其他地方不能以这种方式受到限制。更好地寻找编程方式。 – 2016-03-06 09:49:15

+0

这是不可能的范围检查,所以我打破范围匹配正则表达式。检查我的答案。 – 2016-03-06 10:13:18

回答

1

我发现了另一种解决问题的方法。看一看。

您希望从1990-2050替换年份。让我们打破范围为

  1. 1990-1999
  2. 2000-2049
  3. 2050

所有这三个范围可以通过下面的正则表达式匹配。

正则表达式:[1][9][9][0-9]|[2][0][0-4][0-9]|2050

说明:

  • [1][9][9][0-9]将匹配年内19901999

  • [2][0][0-4][0-9]将匹配从20002049的年份。

  • 2050将匹配2050字面上

  • |装置改变。它将检查这三种模式中的任何一种。

Regex101 Demo

+1

非常感谢! – user3627553

+1

这可以更简单:'199 [0-9] | 20 [0-4] [0-9] | 2050'。 –

+0

@BartFriederichs:是的,这是一个简单的方法。谢谢。 – 2016-03-07 08:12:03

0

你不能从Wikipedia(重点煤矿):

在正则表达式中的每个字符(即,在 字符串描述其模式的每个字符)被理解为是:元字符 (带有其特殊含义)或常规字符(其字面值 含义)。

在你的情况下,这些字母没有字面含义,它们的含义取决于它周围的字符。

1

可以使用CASE则表达式来提取和测试的一年,如果一年落入你想要的范围只能更换:

with test_data (col1) as (
    values ('sdfg 2000'), ('foo 1983'), ('bar 2010'), ('bla 1940') 
) 
select col1, 
     case 
     when nullif(regexp_replace(col1, '[^0-9]+',''),'')::int between 1990 and 2050 
       then regexp_replace(col1, '\d{4}', '', 'g') 
     else col1 
     end as replaced 
from test_data; 

结果在:

col1  | replaced 
----------+--------- 
sdfg 2000 | sdfg  
foo 1983 | foo 1983 
bar 2010 | bar  
bla 1940 | bla 1940 

对于不包含任何数字的值,nullif(..)是必需的。如果你没有这样的价值观,你可以放弃它。