如何用一个空间替换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