sql - SQL / 正则表达式字符串转换
问题描述
嗨,有谁知道在 SQL Server、MySQL 甚至 Postgresql 中如何转换字符串:
'TEST TEST529932******2018'
进入
'TEST TEST\d{6}******\d{4}'
关键是用正则表达式 \d{N} 替换字符串中的所有数字,其中 N 是位数。
解决方案
如果您希望以正则表达式匹配的方式匿名化字符串,那么您只需将每个数字替换为\d
or [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。
推荐阅读
- mysql - 2006, 'SSL 连接错误:未知错误号'
- python - 与 dunder 方法 __dict__ 相比,dict() 做了什么?
- sass - Node-Sass 在编译时包含 @use 指令
- java - 如何证明方法在类图 (UML) 中是同步的?
- javascript - 关闭清除下拉菜单
- python - 第一次尝试将烧瓶应用程序上传到heroku时出现Applicationerror
- python - 快速排序 Python 递归 - 递归函数是如何工作的
- python - 如何将对象插入到MongoDB中的对象中
- java - Java“消息”:“令牌上的语法错误\”;\”,{此令牌后预期”
- database - 如何在 Oracle 数据库 11g 中创建本地模式?