如何用一個空間替換1990-2050年的任何一年?Postgresql regexp_replace
我可以代替任意4位數字如下
select regexp_replace('sdfg 2000', '(\y(\d{4})\y)', '', 'g');
但我怎麼還可以檢查範圍是多少? 任何幫助,歡迎
如何用一個空間替換1990-2050年的任何一年?Postgresql regexp_replace
我可以代替任意4位數字如下
select regexp_replace('sdfg 2000', '(\y(\d{4})\y)', '', 'g');
但我怎麼還可以檢查範圍是多少? 任何幫助,歡迎
我發現了另一種解決問題的方法。看一看。
您希望從1990-2050
替換年份。讓我們打破範圍爲
1990-1999
2000-2049
2050
所有這三個範圍可以通過下面的正則表達式匹配。
正則表達式:[1][9][9][0-9]|[2][0][0-4][0-9]|2050
說明:
[1][9][9][0-9]
將匹配年內1990
到1999
。
[2][0][0-4][0-9]
將匹配從2000
到2049
的年份。
2050
將匹配2050
字面上
|
裝置改變。它將檢查這三種模式中的任何一種。
非常感謝! – user3627553
這可以更簡單:'199 [0-9] | 20 [0-4] [0-9] | 2050'。 –
@BartFriederichs:是的,這是一個簡單的方法。謝謝。 – 2016-03-07 08:12:03
你不能從Wikipedia(重點煤礦):
在正則表達式中的每個字符(即,在 字符串描述其模式的每個字符)被理解爲是:元字符 (帶有其特殊含義)或常規字符(其字面值 含義)。
在你的情況下,這些字母沒有字面含義,它們的含義取決於它周圍的字符。
可以使用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(..)
是必需的。如果你沒有這樣的價值觀,你可以放棄它。
與正則表達式我不認爲你可以。因爲限制第一位數字爲'1'和'2'是可能的。但其他地方不能以這種方式受到限制。更好地尋找編程方式。 – 2016-03-06 09:49:15
這是不可能的範圍檢查,所以我打破範圍匹配正則表達式。檢查我的答案。 – 2016-03-06 10:13:18