【问题标题】:Postgresql regexp_replacePostgresql regexp_replace
【发布时间】:2016-03-06 09:45:42
【问题描述】:

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

我可以如下替换任何4位数字

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

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

【问题讨论】:

  • 使用正则表达式我不认为你可以。因为将第一个数字限制为 12 是可能的。但是其他地方不能这样限制。更好地寻找一些编程方式。
  • 通过范围检查是不可能的,所以我打破了范围以与正则表达式匹配。检查我的答案。

标签: regex postgresql replace


【解决方案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

【讨论】:

  • 这可以更简单:199[0-9]|20[0-4][0-9]|2050.
  • @BartFriederichs:是的,这是一种简单的方法。谢谢。
【解决方案2】:

您可以使用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(..) 对于不包含任何数字的值是必需的。如果你没有这样的价值观,你可以忽略它。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 2015-11-19
      • 2020-12-26
      • 2017-11-07
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2020-02-15
      相关资源
      最近更新 更多