如何用空格替换1990 - 2050年的任何一年?
我可以更换任何4位数字,如下所示
select regexp_replace('sdfg 2000', '(\y(\d{4})\y)', '', 'g');
但我还能检查范围吗? 欢迎任何帮助
答案 0 :(得分:1)
我发现了另一种解决问题的方法。看一看。
您希望从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
字面上匹配
|
表示更改。它将检查这三种模式中的任何一种。
的 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(强调我的):
正则表达式中的每个字符(即,每个字符 描述其模式的字符串)被理解为:元字符 (具有特殊含义)或常规字符(带有文字) 意)。
在你的情况下,这些字母没有字面含义,它们的含义取决于它周围的字符。