MySQL 正则表达式

MySQL REGEXP_REPLACE() 函数将 string 中与 pattern 指定的正则表达式匹配的匹配项替换为替换字符串replace,并返回结果字符串。如果字符串或模式为NULL,则返回值为NULL。

默认情况下,REGEXP_REPLACE() 函数执行不区分大小写的匹配,除非与二进制字符串一起使用。

语法

REGEXP_REPLACE(string, pattern, replace, 
               position, occurrence, match_type) 

参数

string必填。 指定要搜索的字符串。
pattern必填。 指定正则表达式匹配信息。请参阅下表了解模式语法。
replace必需。 指定替换子字符串。
position可选。 指定字符串中开始搜索的位置。默认值为 1。
occurrence可选。 指定要替换的匹配项。默认值为 0(表示"替换所有出现的位置")。
match_type可选。 指定如何执行匹配。它可以采用以下值:
  • c -  区分大小写的匹配
  • i -  不区分大小写的匹配
  • m -  多行模式。识别字符串中的行终止符。默认行为是仅在字符串表达式的开头和结尾匹配行终止符
  • n -  .字符与行终止符匹配。默认值为 .匹配在行尾停止
  • u -  仅限 Unix 的行结尾。仅换行符被识别为以 .、^ 和 $ 匹配运算符结尾的行

有关此参数的其他信息,请参阅 REGEXP_LIKE() 函数。

正则表达式模式

符号描述
^匹配字符串的开头。
$匹配字符串的结尾字符串。
*匹配零次或多次出现。
+匹配一次或多次出现。
?匹配零次或一次出现。
.匹配除 NULL 之外的任何字符。
|像"OR"一样使用来指定多个替代字符。
[ ]匹配 [] 内指定的任何单个字符。
[^ ]匹配 [] 内未指定的任何单个字符。
-表示字符范围。
( )用于将表达式分组为子表达式。
{m}匹配 m
{m,}匹配至少 m 次。
{m,n}匹配至少 m 次,但不超过 n 次。
\nn 是 1 到 9 之间的数字。匹配找到的第 n 个子表达式在 ( ) 内遇到 \n 之前。
\d匹配数字字符。
\D匹配非数字字符。
\w匹配单词字符。
\W匹配非单词字符。
\s匹配空白字符。
\s匹配空白字符。
\S匹配非空白字符。
*?匹配前面的模式出现零次或多次。
+?匹配前面的模式出现一次或多次。
??匹配前面的模式零次或一次出现。
?匹配前面的模式n 次。
?与前面的模式匹配至少 n 次。
?匹配前面的模式至少 n 次,但不超过 m 次。
[..]匹配一种排序规则可以是多个字符的元素。
[=character_class=]表示一个等价类。它匹配具有相同排序值的所有字符,包括其自身。
[:character_class:]表示匹配属于该字符的所有字符的字符类

标准类名列表

字符类名称含义
alnum字母数字字符
alpha字母字符
blank空白字符
cntrl控制字符
digit数字字符
graph图形字符
lower小写字母字符
print图形或空格字符
punct标点符号
space空格、制表符、换行符和回车符
upper大写字母字符
xdigit十六进制数字字符

示例:REGEXP_REPLACE() 示例

下面的示例显示了REGEXP_REPLACE() 函数的用法。

mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
Result: 'a X c'

mysql> SELECT REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3);
Result: 'abc def X'

mysql> SELECT REGEXP_REPLACE('abc123ghi', '[0-9]+', '');
Result: 'abcghi'

mysql> SELECT REGEXP_REPLACE('<html><head><title>title</title><body>body</body></htm>', '','');
Result: 'titlebody' 

示例:匹配多个替代项

考虑一个名为 Employee 的数据库表,其中包含以下记录:

EmpIDNameCityAge
1John SmithLondon25
2Marry KnightNew York24
3Jo WilliamsParis27
4Smith FischerAmsterdam30
5Aman GuptaNew Delhi28

以下查询是用于将City列记录中的所有元音替换为"@"。要在模式中指定多个替代方案,请使用 |

SELECT *, 
REGEXP_REPLACE(City, 'a|e|i|o|u', '@') AS Replaced_City
FROM Employee 

这将产生类似于以下内容的结果:

EmpIDNameCityAgeReplaced_City
1John SmithLondon25L@nd@n
2Marry KnightNew York24N@w Y@rk
3Jo WilliamsParis27P@r@s
4Smith FischerAmsterdam30@mst@rd@m
5Aman GuptaNew Delhi28N@w D@lh@

示例:单词匹配

考虑上面讨论的表格。以下查询用于将 Name 列中的第一个单词(名字)替换为"Mr."。要指定字符范围,请使用 [  ]

SELECT *, 
REGEXP_REPLACE(Name, '[a-z]+', 'Mr.', 1, 1) AS ReplacedName
FROM Employee 

这将产生类似于以下内容的结果:

EmpIDNameCityAgeReplacedName
1John SmithLondon25Mr. Smith
2Marry KnightNew York24Mr. Knight
3Jo WilliamsParis27Mr. Williams
4Smith FischerAmsterdam30Mr. Fischer
5Aman GuptaNew Delhi28Mr. Gupta