2016-03-06 59 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(..)是必需的。如果你沒有這樣的價值觀,你可以放棄它。