首页 > 解决方案 > SQL / 正则表达式字符串转换

问题描述

嗨,有谁知道在 SQL Server、MySQL 甚至 Postgresql 中如何转换字符串:

'TEST TEST529932******2018'

进入

'TEST TEST\d{6}******\d{4}'

关键是用正则表达式 \d{N} 替换字符串中的所有数字,其中 N 是位数。

标签: sqlregexstringpostgresql

解决方案


如果您希望以正则表达式匹配的方式匿名化字符串,那么您只需将每个数字替换为\dor [0-9]。这很容易做到:

select regexp_replace(str, '[0-9]', '\d', 'g')
from (values ('TEST TEST529932******2018')) v(str)

这会产生:

'TEST TEST\d\d\d\d\d\d******\d\d\d\d'

我不确定这是否满足您的实际需求。

一种方法是使用递归 CTE:

with recursive cte as (
      select regexp_replace(str, '(^|[^0-9])[0-9]', '\1\d{1}', 'g') as str, 1 as lev
      from t 
      union all
      select regexp_replace(str, '\\d\{' || lev || '\}[0-9]', '\d{' || (lev + 1) || '}', 'g'), lev + 1
      from cte
      where str ~ '[^{][0-9]'
     )
select *
from cte;

是一个 db<>fiddle。


推荐阅读