Postgresql regexp_replace

时间:2016-03-06 09:45:42

标签: regex postgresql replace

如何用空格替换1990 - 2050年的任何一年?

我可以更换任何4位数字,如下所示

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

但我还能检查范围吗? 欢迎任何帮助

3 个答案:

答案 0 :(得分:1)

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

您希望从1990-2050替换年份。让我们把这个范围打破到

  1. 1990-1999
  2. 2000-2049
  3. 2050
  4. 以下正则表达式可以匹配所有三个范围。

    正则表达式: [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的年份。

    • 20502050字面上匹配

    • |表示更改。它将检查这三种模式中的任何一种。

    Regex101 Demo

答案 1 :(得分: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(..)对于不包含任何数字的值是必需的。如果你没有这样的价值观,你可以把它留下来。

答案 2 :(得分:0)

你不能,Wikipedia(强调我的):

  

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

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