如何在SQL中使用正则表达式进行数据清理_利用REGEXP_REPLACE函数

陌萱小哥_9654

陌萱小哥_9654

2026-05-25

360人浏览

原创

MySQL 8.0+ 的 REGEXP_REPLACE 需版本≥8.0.4,语法为 REGEXP_REPLACE(str, pattern, replacement[, position[, occurrence[, match_type]]),pattern 用 POSIX ERE(如 [0-9]),捕获组引用写为 ,replacement 为空字符串合法。

如何在sql中使用正则表达式进行数据清理_利用regexp_replace函数

MySQL 8.0+ 的 REGEXP_REPLACE 怎么写才不报错

不是所有 MySQL 版本都支持 REGEXP_REPLACE,5.7 及更早版本直接调用会报错 FUNCTION xxx.REGEXP_REPLACE does not exist。必须确认版本 ≥ 8.0.4,且 sql_mode 中不含 NO_ENGINE_SUBSTITUTION 以外的正则限制项(实际影响不大,但某些严格模式下会抑制警告)。

基础语法是:REGEXP_REPLACE(str, pattern, replacement[, position[, occurrence[, match_type]])。前三个参数必填,position 默认为 1(从开头匹配),occurrence 默认为 0(替换全部匹配),match_type 常用值有 'c'(大小写敏感)、'i'(忽略大小写),不传则按列字符集排序规则决定。

  • pattern 中不能用 PCRE 风格的 d 或 s,MySQL 使用 POSIX ERE 语法,得写成 [0-9]、[[:space:]]
  • replacement 字符串里不能直接写 $1 引用捕获组,要用 \1(双反斜杠),且捕获组必须用括号 () 明确定义
  • 空字符串 '' 作为 replacement 是合法的,但若 pattern 为空或为 ^$ 类边界匹配,可能意外清空整列

清理手机号中间四位:为什么 REGEXP_REPLACE(phone, '(\d{3})\d{4}(\d{4})', '\1****\2') 有时失效

这个写法在大多数中国手机号场景下有效,但容易忽略两个现实问题:原始数据含空格、横线、括号,或开头带 +86/0086;还有部分号码是 170/171 等虚拟运营商号,但位数仍是 11 位,不影响匹配。

真正导致失效的是 pattern 没做前置清洗和锚定:

  • 没加 ^ 和 $ 锚点,遇到 'tel:13812345678' 这类带前缀的数据,会错误匹配子串,结果变成 'tel:138****5678'
  • 没先用 TRIM() 和 REPLACE() 去掉空格、短横线,pattern 中的 \d 不会匹配这些符号,导致整个正则失败
  • 应该组合使用:REGEXP_REPLACE(TRIM(REPLACE(REPLACE(phone, '-', ''), ' ', '')), '^1[3-9][0-9]{9}$', '\1****\2') —— 注意这里 pattern 实际要配合捕获组重写为 ^(1[3-9][0-9]{2})([0-9]{4})([0-9]{4})$,才能正确提取首三位和末四位

PostgreSQL 用 REGEXP_REPLACE 替换邮箱域名时,'g' 标志和 'i' 标志能一起用吗

可以,PostgreSQL 支持多标志组合,比如 'gi' 表示全局 + 忽略大小写。但要注意顺序无关,'ig' 效果相同。

快乐小马
快乐小马

快乐小马是一款HappyHorse官方AI视频生成平台。

下载

常见误用是以为 'g' 能跨行替换——其实默认不匹配换行符,除非显式在 pattern 中加入 [ ] 或开启 'n' 标志(使 . 匹配换行)。另外,PostgreSQL 的捕获组引用用的是 \1、\2,和 MySQL 一致,但不支持 $1。

  • 想把所有 @gmail.com 换成 @example.com,安全写法是:REGEXP_REPLACE(email, '@gmail\.com$', '@example.com', 'gi')(注意点号要转义)
  • 如果 email 字段含多个邮箱(逗号分隔),用 'g' 才能全量替换;否则只换第一个
  • pattern 末尾加 $ 很关键,避免把 myname@gmail.com.cn 错误替换成 myname@example.com.cn

Oracle 中没有 REGEXP_REPLACE?其实是有的,但默认行为和 MySQL 差很多

Oracle 自 10g 起就支持 REGEXP_REPLACE,函数签名是 REGEXP_REPLACE(source_string, pattern, replace_string[, position[, occurrence[, match_parameter]]),看着像,但默认行为差异大:

  • Oracle 默认只替换第一个匹配(occurrence = 0 表示全部,和 MySQL 相反)
  • match_parameter 常用值是 'i'(忽略大小写)、'c'(区分大小写)、'n'(让 . 匹配换行)、'm'(多行模式,^/$ 匹配每行起止)
  • Oracle 的 POSIX 语法更严格,[[:digit:]] 可用,但 \d 不识别;中文字符需用 Unicode 类如 \u4E00-\u9FFF,不能靠 [x{4E00}-x{9FFF}]
  • 性能上,Oracle 对长文本 + 复杂正则响应明显变慢,建议先用 LENGTH() 过滤超长字段再进正则处理

真正麻烦的是 Oracle 不支持在 WHERE 子句中对 REGEXP_REPLACE 结果直接建索引,线上大表做清洗时,最好先 UPDATE ... SET col = REGEXP_REPLACE(col, ...) 落库,别总在查询时实时计算。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

正则表达式

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3529

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2408

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1360

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1298

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1416

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2318

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3800

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

17835

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JavaScript正则表达式基础与实战
JavaScript正则表达式基础与实战

共11课时 | 1.7万人学习

布尔教育正则表达式视频教程
布尔教育正则表达式视频教程

共14课时 | 5.1万人学习